ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C逻辑运算符的Subexpressions评价顺序

2019-08-24 15:17:53  阅读:183  来源: 互联网

标签:c operator-precedence


关于优先级和评估顺序的概念有很多问题,但我没有找到一个涉及我的特殊情况的问题.

请考虑以下声明:

if(f(0) && g(0)) {};

是否保证首先评估f(0)?请注意,操作符是&&.

我的困惑源于我在“C编程语言”(Stroustrup,4ed,2013)中所读到的内容.

在本书的第10.3.2节中,它说:

The order of evaluation of subexpressions within an expression is undefined. In particular, you cannot assume that the expression is evaluated left-to-right. For example:

int x = f(2)+g(3); // undefined whether f() or g() is called first

这似乎适用于所有操作符,包括&&操作符,但在以下段落中说:

The operators , (comma), && (logical and), and || (logical or) guarantee that their left-hand operand is evaluated before their right-hand operand.

第11.1.1节还提到了另一个问题:

The && and || operators evaluate their second argument only if necessary, so they can be used to control evaluation order (§10.3.2). For example:

while (p && !whitespace(p)) ++p;

Here, p is not dereferenced if it is the nullptr.

最后一句话暗示&&和||首先评估他们的第一个参数,所以它似乎强化了我的假设,即第二个引用中提到的运算符是第一个引用的例外,但我也无法从最后一个例子中得出明确的结论,因为表达式只包含一个子表达式而不是我的例子,其中包含两个.

解决方法:

&&,||和的特殊排序行为在C和C中已经很好地建立.您引用的第一个句子应该说“表达式中子表达式的评估顺序通常是未定义的”或“除了一些特定的例外情况,表达式中子表达式的评估顺序是未定义的”.

你询问了C,但C FAQ list中的this question是相关的.

标签:c,operator-precedence
来源: https://codeday.me/bug/20190824/1709513.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有