C 编译器会在每个语句的多个比较中检查UB优先级吗?
如果数组中只填充了C 编译器会在每个语句的多个比较中检查UB优先级吗?,c,undefined-behavior,C,Undefined Behavior,如果数组中只填充了0,此代码是否会导致未定义的行为? 或者编译器可以对不太关键的条件进行一些检查,例如“首先检查自动非指针值” uiaDigit[10]; 对于(sizeIndexI=0;sizeIndexI
0
,此代码是否会导致未定义的行为?
或者编译器可以对不太关键的条件进行一些检查,例如“首先检查自动非指针值”
uiaDigit[10];
对于(sizeIndexI=0;sizeIndexI<10&&uiaDigit[sizeIndexI]==0;sizeIndexI++)
;
我会猜一些像阅读指导的东西,好像它是
“AND比较将始终从左向右读取,并在第一个false时中断”
最多是实现定义的行为,不是吗
因此,如果
sizeIndexI
得到10,编译器是否会得到它,他无论如何都必须打破它,或者他会比较'uiaDigit[10]==0'吗?你是对的,&&是一个序列点。请参见此问题的答案:
您是对的,&&是一个序列点。请参见此问题的答案:
对于
&&
运算符,从左到右进行计算。因此,如果希望跳过指针操作,请将其放在表达式的最右边
C标准“6.5.13逻辑与运算符”
4与按位二进制&运算符不同,&&运算符保证从左到右求值;
第一个操作数求值后有一个序列点。如果第一个操作数
如果比较值等于0,则不计算第二个操作数
对于
&&
运算符,从左到右进行计算。因此,如果希望跳过指针操作,请将其放在表达式的最右边
C标准“6.5.13逻辑与运算符”
4与按位二进制&运算符不同,&&运算符保证从左到右求值;
第一个操作数求值后有一个序列点。如果第一个操作数
如果比较值等于0,则不计算第二个操作数
逻辑and(&&
)将从左到右求值,如果第一个操作数的求值为0
,则将从左到右求值。第6.5.13节“逻辑与运算符”第4段中的内容(重点):
与按位二进制&运算符不同,&&运算符保证从左到右求值;
第一个操作数求值后有一个序列点如果第一个操作数
如果比较值等于0,则不计算第二个操作数。
所以这个代码:
sizeIndexI < 10 && uiaDigit[sizeIndexI] == 0
sizeIndexI<10&&uiaDigit[sizeIndexI]==0
当sizeIndexI<10
计算为0
时,将不会计算uiaDigit[sizeIndexI]==0
,这将阻止代码访问uiaDigit
的边界之外
如果不初始化uiaDigit
,并且它是一个局部变量,那么它将包含不确定的值,并且程序将不会有可确定的行为。逻辑and(&&
)将从左到右求值,如果第一个操作数的求值结果为0
,则将从左到右求值。第6.5.13节“逻辑与运算符”第4段中的内容(重点):
与按位二进制&运算符不同,&&运算符保证从左到右求值;
第一个操作数求值后有一个序列点如果第一个操作数
如果比较值等于0,则不计算第二个操作数。
所以这个代码:
sizeIndexI < 10 && uiaDigit[sizeIndexI] == 0
sizeIndexI<10&&uiaDigit[sizeIndexI]==0
当sizeIndexI<10
计算为0
时,将不会计算uiaDigit[sizeIndexI]==0
,这将阻止代码访问uiaDigit
的边界之外
如果您不初始化uiaDigit,并且它是一个局部变量,那么它将包含不确定的值,并且程序将不会有可确定的行为。您的表达式将通过短路求值从左到右求值。编译器不会更改求值顺序,因为它认为一个条件比另一个条件更可能导致UB。那只是你一厢情愿的想法 根据ISO/IEC 9899:201x N1570标准草案: 6.5.13逻辑与运算符 与按位二进制&运算符不同,&&运算符保证从左到右求值; 如果对第二个操作数求值,则两个操作数求值之间有一个序列点 第一个和第二个操作数。如果第一个操作数比较等于0,则第二个操作数 不计算操作数
表达式将使用短路求值从左向右求值。编译器不会更改求值顺序,因为它认为一个条件比另一个条件更可能导致UB。那只是你一厢情愿的想法 根据ISO/IEC 9899:201x N1570标准草案: 6.5.13逻辑与运算符 与按位二进制&运算符不同,&&运算符保证从左到右求值; 如果对第二个操作数求值,则两个操作数求值之间有一个序列点 第一个和第二个操作数。如果第一个操作数比较等于0,则第二个操作数 不计算操作数
这是从左到右执行的定义行为,如果第一个为假,它将爆发?@EricPostIschil:我调整了措辞。这是从左到右执行的定义行为,如果第一个为假,它将爆发?@EricPostIschil:我调整了措辞。假设uiaDigit被初始化为满0。等等等一下,你刚刚颠倒了问题中的比较。它是sizeIndexI<10&&uiaDigit[sizeIndexI]==0还是uiaDigit[sizeIndexI]==0&&sizeIndexI<10?假设uiaDigit被初始化为满0。请稍候,您刚刚颠倒了问题中的比较。它是sizeIndexI<10&&uiaDigit[sizeIndexI]==0还是uiaDigit[sizeIndexI]==0