了解C编程中的逻辑表达式

时间:2019-07-18 06:07:41

标签: c

我正在独自学习C,并且正在学习一本没有答案的练习。我无法理解为什么在编译器中运行以下表达式时其结果为“ true”或“ 1”。我了解优先级,关联性以及逻辑运算符的工作方式,但是a +=使我震惊。我不知道这与是非有关。感谢您提供任何帮助或解释,以帮助您评估结果是否正确。

 int a = 1, b = 2, c = 3;

 a += !b && c == ! 5;

2 个答案:

答案 0 :(得分:2)

a += !b && c == ! 5

解析为

a += ((!b) && (c == (! 5)))

我们可以依次评估每个子表达式:

  • b2
  • !b0(因为!将所有非零值都变成零,并且将零都变成一)。
  • 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
  • 0c == 0(因为0c,而3返回==为真,1为假) 。

答案 1 :(得分:1)

表达式a += !b && c == ! 5;等效于a = a + (!b && c == ! 5);。 希望能有所帮助,也希望您在实践中永远不会遇到这样的表达。