Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编译器会在每个语句的多个比较中检查UB优先级吗?_C_Undefined Behavior - Fatal编程技术网

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