2
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 ) ;
}

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

w = 1 x = 0 y = 1 z = 1

'w' 如何等于 1?我不明白。

4

5 回答 5

11

||是逻辑 OR 运算符。从 C11 s6.5.14 逻辑或运算符

|| 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果具有 int 类型。

... || 运算符保证从左到右的评估;

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

w = i || j || k  == (i || j) || k
                 == (non-zero || non-zero) || 0
                 == 1 || 0
                 == 1

x, y,的计算z类似。C11 s6.5.13.3规定&&操作员的结果应为 0 或 1。

于 2013-06-27T16:39:02.977 回答
6

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

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

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

  • i || j || k计算为1, 因为ij不为零
  • i && j && k评估为0,因为k为零,
  • ...等等。
于 2013-06-27T16:39:47.033 回答
5

这就是它在概念上的工作方式:

w = 我 || j || ķ;

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

w =真 || 0; //4 || -1 评估为真

w = (真); //true 被赋值给整数

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

于 2013-06-27T16:44:59.457 回答
2

是逻辑运算。

|| - 表示逻辑,或者,如果至少一个元素不为 0,则结​​果为 1,否则为 0;&& - 表示逻辑,如果所有元素都为 1,则结果为 1,否则为 0;

逻辑且具有更高的优先级,因此:

x = 0 || 4 && 0;

将为 0,因为:

  1. 4&&0 = 0
  2. 0||0 = 0。

这些运算符大约是数字的全部值。有| 和 & 与位相关的运算符。关于工作和优先级的一切都是一样的,只是一个简短的例子:

uint8_t x = 2 || 4 && 7;



1. 4=00000100 and 7=00000111
      00000100
   &  00000111
gives:00000100
 2. 2=00000010
      00000010
   |  00000100
gives:00000110, it is 6

我希望它会有所帮助。

于 2013-06-27T17:11:20.167 回答
2

||是逻辑OR

w = i || j || k;

相当于:

w = (i != 0) || (j != 0) || (k != 0);

i是 4,这说明这w是真的(当 C 使用整数来处理布尔值时,它被评估为 1)。

这同样适用于&&(逻辑AND)等。

于 2013-06-27T16:40:45.800 回答