短路评估评估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
由于短路而被分配。查看第一个
|
之后的任何内容都没有意义,因此