短路评估评估if((a=4)| |(b=6)| |(c=7)| |(d=8))
该计划发布如下:短路评估评估if((a=4)| |(b=6)| |(c=7)| |(d=8)),c,if-statement,logical-operators,C,If Statement,Logical Operators,该计划发布如下: #include <stdio.h> int main(void) { int a, b, c, d; printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d); if( (a = 4) || (b = 6) || (c = 7) || (d = 8) ) printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d); }
#include <stdio.h>
int main(void)
{
int a, b, c, d;
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
}
那么,第二个if语句最终是真的,但如何实现呢?我以为一个等号会给变量赋值 我不明白当只有一个等号而不是两个等号时,if将如何计算 一个等号表示赋值。因此,
a=4
的计算结果为4
,逻辑“或”运算符|
将其解释为“true”。此时,由于短路,不会发生进一步的计算,因此剩余变量保留在if
语句之前的值
注意:打印未分配的变量会导致未定义的行为。您应按如下方式更改声明行:
int a = 0, b = 0, c = 0, d = 0;
我不明白当只有一个等号而不是两个等号时,if将如何计算
一个等号表示赋值。因此,a=4
的计算结果为4
,逻辑“或”运算符|
将其解释为“true”。此时,由于短路,不会发生进一步的计算,因此剩余变量保留在if
语句之前的值
注意:打印未分配的变量会导致未定义的行为。您应按如下方式更改声明行:
int a = 0, b = 0, c = 0, d = 0;
那么第二个if语句最终是真的,但是如何呢
在C语言中,赋值也是一种计算结果为某个值的表达式。该值(在大多数情况下)位于赋值的右侧
在这种情况下,(a=4)
的计算结果为4,这在C的世界中是真的
,因此短路整个条件并跳过b
、C
和d
的赋值。这就是为什么只有a
被初始化,而其他的保留它们的垃圾值
那么第二个if语句最终是真的,但是如何呢
在C语言中,赋值也是一种计算结果为某个值的表达式。该值(在大多数情况下)位于赋值的右侧
在这种情况下,(a=4)
的计算结果为4,这在C的世界中是真的
,因此短路整个条件并跳过b
、C
和d
的赋值。这就是为什么只有a
被初始化,而其他的保留它们的垃圾值。这个printf调用
int a, b, c, d;
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
具有未定义的行为,因为变量a、b、c和d未初始化,并且具有可以作为陷阱值的不确定值
在if语句的条件下
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
有赋值表达式
a = 4
根据C标准(6.5.16赋值运算符)
3赋值运算符将值存储在由指定的对象中
左操作数赋值表达式的值为左
赋值后的操作数,111),但不是左值
以及进一步(6.5.14逻辑或运算符)
3如果| |运算符的任一操作数进行比较,则| |运算符应产生1
不等于0;否则,结果为0。结果的类型为int。
4与按位|运算符不同,| |运算符保证
从左到右评价;如果对第二个操作数求值,则
第一次和第二次评估之间的序列点
操作数如果第一个操作数比较不等于0,则第二个操作数
未计算操作数。
因此,只有任务
a = 4
将在此if语句中执行
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
所有其他变量仍将未初始化
由于赋值值4不等于0,因此将执行if子语句。此printf调用
int a, b, c, d;
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
具有未定义的行为,因为变量a、b、c和d未初始化,并且具有可以作为陷阱值的不确定值
在if语句的条件下
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
有赋值表达式
a = 4
根据C标准(6.5.16赋值运算符)
3赋值运算符将值存储在由指定的对象中
左操作数赋值表达式的值为左
赋值后的操作数,111),但不是左值
以及进一步(6.5.14逻辑或运算符)
3如果| |运算符的任一操作数进行比较,则| |运算符应产生1
不等于0;否则,结果为0。结果的类型为int。
4与按位|运算符不同,| |运算符保证
从左到右评价;如果对第二个操作数求值,则
第一次和第二次评估之间的序列点
操作数如果第一个操作数比较不等于0,则第二个操作数
未计算操作数。
因此,只有任务
a = 4
将在此if语句中执行
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
所有其他变量仍将未初始化
由于赋值的值4不等于0,则将执行if子语句。简而言之,当使用OR进行比较时,将执行求值,直到第一次出现TRUE。因此,只分配了a=4。其余的仍未初始化 简而言之,当您使用OR进行比较时,计算将一直进行到第一次出现TRUE。因此,只分配了a=4。其余的仍未初始化 第一个printf是未定义的行为,因为您尚未初始化任何变量。所有变量均未初始化。最后,只有
a
被设置为4
,而其他的仍然未初始化。使用=
测试是否相等a=4
将值4分配给a
。分配一个等号,然后返回分配的值(因此第一次分配为true
,跳过其余分配)。只有a
由于短路而被分配。查看第一个|
之后的任何内容都没有意义,因此