我已经看到了一种特殊的代码风格,根据我的说法是危险的,应该避免,但我已经在很多地方看过很多次了,我很困惑,不管我是否遗漏了什么。
int a[100];
/* Some code later */
for(i =0; (i < 100 && a[i] != 0); i++)
:
:
在上面的代码中,表达式(i&lt; 100&amp; a [i]!= 0)可能从右到左进行评估,在这种情况下当i == 100时,我们就要出去了数组'a'的边界。
有人可以解释这是否是安全代码
答案 0 :(得分:4)
&&
定义良好,无法更改。 #1
加上 short circuiting 使这绝对安全。<强>参考文献:强>
C ++ 03标准:
第5节:表达式,第4段:
除非另有说明,否则&amp;&amp; amp;的特殊规则和|| ],单个运算符的操作数和各个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的。
C99标准:
第6.5节:
运算符和操作数的分组由语法指示.72)除非后面指定 (对于函数调用(),&amp;&amp;,||,?:和逗号运算符) ,子表达式的评估顺序和副作用发生的顺序都是未指定的。
注意:强调我的。
答案 1 :(得分:3)
我认为当a[i]
为假时,您可以指望short-circuit evaluation不要访问i < 100
。
答案 2 :(得分:2)
(i < 100 && a[i] != 0)
无法从右到左进行评估。 &&
和||
被明确定义为首先评估他们的左参数,并且仅在必要时评估他们的右参数。
答案 3 :(得分:1)
&#34;在上面的代码中,表达式(i <100&amp; a [i]!= 0)可能从右到左进行评估......&#34;
不,这在C和C ++中都是不可能的。在这两种语言中,保证从左到右对该表达式进行求值。如果第一部分为假,则保证第二部分不被评估。
因此,代码对于越界访问是完全安全的。
答案 4 :(得分:0)
&安培;&安培;和||每个人都说从左到右进行评估。您可能需要考虑以下链接以获取更多信息
http://en.cppreference.com/w/cpp/language/operator_precedence