如何|| 和&&的作品

sen*_*ack 2 c c++ variable-assignment

main( ) {
    int   i = 4, j = -1, k = 0, w, x, y, z ;
    w = i || j || k ;
    x = i && j && k ;
    y = i || j && k ;
    z = i && j || k ;
    printf ( "\nw = %d x = %d y = %d z = %d", w, x, y, z ) ;
}
Run Code Online (Sandbox Code Playgroud)

我只是学习C而且我遇到了这段代码.老实说,我不知道w,x,y和z分配给了什么.显然输出如下:

w = 1 x = 0 y = 1 z = 1
Run Code Online (Sandbox Code Playgroud)

'w'如何等于1?我不懂.

sim*_*onc 11

||是逻辑OR运算符.来自C11 s6.5.14逻辑OR运算符

|| 如果操作数的任何一个比较不等于0,则运算符应该为1; 否则,它产生0.结果类型为int.

...... || 运营商保证从左到右的评估;

将此应用于w我们得到的计算

w = i || j || k  == (i || j) || k
                 == (non-zero || non-zero) || 0
                 == 1 || 0
                 == 1
Run Code Online (Sandbox Code Playgroud)

用于计算x,y,z是相似的.C11 s6.5.13.3规定&&运算符的结果应为0或1.


das*_*ght 6

在C中,布尔值没有"强"内置类型,因此使用整数.评估逻辑表达式的结果(例如使用||和的逻辑表达式)&&可以分配给整数变量.

当在逻辑运算符中使用值时,布尔解释非常简单:零被解释为false,而所有非零值都被解释为true.

现在你应该能够自己找出表达式:

  • i || j || k评估为1,因为i并且j不是零
  • i && j && k评估为0,因为k是零,
  • ...等等.


Ana*_*tel 5

这在概念上是如何工作的:

w = i || j || K表;

w = 4 || -1 || 0; //值已替换

w = 真|| 0; // 4 || -1计算结果为true

w =(真); // true被分配给整数

w = 1; // 0为假,1为真