0

如果数组只是用0's 填充,此代码会导致未定义的行为吗?或者编译器可以对不太关键的条件进行一些检查,即“首先检查自动非指针值”

uiaDigit[10];

for (sizeIndexI = 0; sizeIndexI < 10 && uiaDigit[sizeIndexI] == 0; sizeIndexI++)
    ;

我猜想像阅读方向这样的东西

“AND 比较总是从左到右读取,一开始是假的”

最多是实现定义的行为,不是吗?

那么编译器是否会得到它,如果得到 10,他无论如何都必须突破sizeIndexI,或者他会比较 'uiaDigit[10] == 0' 吗?

4

4 回答 4

1

你是对的, && 是一个序列点。请参阅此问题的答案: 短路评估和副作用

于 2013-09-16T14:40:02.600 回答
1

对于&&操作员,评估是从左到右进行的。因此,如果您想跳过指针操作,请将其放在表达式的最右侧。

C 标准“6.5.13 逻辑与运算符”

4 与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。

于 2013-09-16T14:40:05.167 回答
1

逻辑 and( &&) 将从左到右计算,如果第一个操作数计算为,则会短路0逻辑与运算符4节中的C99 标准草案说(强调我的):6.5.13

与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。

所以这段代码:

sizeIndexI < 10 && uiaDigit[sizeIndexI] == 0

不会评估uiaDigit[sizeIndexI] == 0whensizeIndexI < 10评估 to 0which 将阻止代码访问uiaDigit.

如果您不初始化uiaDigit并且它是一个局部变量,它将包含不确定的值,并且程序将没有可确定的行为。

于 2013-09-16T14:40:23.887 回答
1

您的表达式通过短路评估从左到右进行评估。编译器不会更改评估顺序,因为它认为一种情况比另一种更可能导致 UB。那只是你的一厢情愿!

根据标准,ISO/IEC 9899:201x N1570 草案:

6.5.13 逻辑与运算符

……

与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。

于 2013-09-16T14:40:55.437 回答