我正在独自学习C,并且正在学习一本没有答案的练习。我无法理解为什么在编译器中运行以下表达式时其结果为“ true”或“ 1”。我了解优先级,关联性以及逻辑运算符的工作方式,但是a +=
使我震惊。我不知道这与是非有关。感谢您提供任何帮助或解释,以帮助您评估结果是否正确。
int a = 1, b = 2, c = 3;
a += !b && c == ! 5;
答案 0 :(得分:2)
a += !b && c == ! 5
解析为
a += ((!b) && (c == (! 5)))
我们可以依次评估每个子表达式:
b
是2
。!b
是0
(因为!
将所有非零值都变成零,并且将零都变成一)。0 && ...
不会评估其右侧,但会立即返回0
。a += 0
等效于a = a + 0
,它不更改a
的值,但返回其新值(在这种情况下与旧值相同),{{1 }}。1
不是零,所以是真的。如果这是使您烦恼的事情:赋值运算符就是运算符。具有效果(将值分配给变量),但它们也具有结果。对于所有赋值运算符,结果是要赋值:
1
输出int n = 2;
printf("%d\n", n += 3);
,并将5
设置为n
。
仅出于完整性考虑,5
的评估如下:
c == (!5)
是!5
。0
为c == 0
(因为0
为c
,而3
返回==
为真,1
为假) 。答案 1 :(得分:1)
表达式a += !b && c == ! 5;
等效于a = a + (!b && c == ! 5);
。
希望能有所帮助,也希望您在实践中永远不会遇到这样的表达。