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?我不明白。
答案 0 :(得分:11)
||
是逻辑OR运算符。来自C11 s6.5.14逻辑OR运算符
||如果任一操作数进行比较,则运算符应为1 不等于0;否则,它产生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。
答案 1 :(得分:6)
在C中,布尔值没有“强”内置类型,因此使用整数。评估逻辑表达式(例如使用||
和&&
的结果)的结果可以分配给整数变量。
当在逻辑运算符中使用值时,布尔解释非常简单:零被解释为false
,而所有非零值被解释为true
。
现在你应该能够自己找出表达式:
i || j || k
评估为1
,因为i
和j
不是零i && j && k
评估为0
,因为k
为零,答案 2 :(得分:5)
这就是它在概念上的运作方式:
w = i || j || K表;
w = 4 || -1 || 0; //值已替换
w = true || 0; // 4 || -1评估为真
w =(true); // true被赋值为整数
w = 1; // 0为假,1为真
答案 3 :(得分:2)
||
是合乎逻辑的 OR 。
w = i || j || k;
相当于:
w = (i != 0) || (j != 0) || (k != 0);
i
是4,这解释了w
为真(由于C使用整数来处理布尔值,因此将其计算为1)。
同样适用于&&
(逻辑 AND )等。
答案 4 :(得分:2)
这是逻辑操作。
|| - 表示逻辑或,如果至少一个元素不为0,则结果为1,否则为0; &安培;&安培; - 表示逻辑,如果所有元素均为1,则结果为1,否则为0;
逻辑且具有更高的优先级,因此:
x = 0 || 4 && 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
我希望它有所帮助。