【问题标题】:C-Arithmetics and precedenceC-算术和优先级
【发布时间】:2021-02-13 08:49:01
【问题描述】:

我正在练习更快地阅读 C 代码,但我很难理解这部分:

int a = 7, b = 3, c = 2, d;

d = (b+c >a) || a > c ? a-- : a++;

当我将它输入我的程序并打印出整数 d 时,我得到的结果是 7。但我真的不明白为什么。有人可以向我解释一下吗?

【问题讨论】:

  • 在您期望有所不同的情况下,您应该始终添加您期望的内容和原因。这有助于为特定问题提供具体帮助。

标签: c integer calculation


【解决方案1】:

您正在为d 分配a--a++ 的值。这两个表达式的值都是7a原始值);运算符之间的区别在于它们对操作数 (a) 所做的操作 评估表达式:一个然后递增它,另一个递减它。

这就是为什么它们被称为 post-increment 和 post-decrement 运算符。

也许您对 pre-increment 和 pre-decrement 运算符感到困惑,它们是 ++a--a? (另见:Pre increment vs Post increment in array。)

至于三元运算符(x ? y : z)以及如何“读取”它,那么您可以将其视为if x then y else z;,因此,如果测试结果(具有逻辑或,这意味着它将是如果 其中一个 比较为真,则为真)为真,则 d = a--,否则为 d = a++。但是,正如已经提到的,在这种情况下,两者都会给d 赋予相同的值(尽管它们会对a 产生不同的影响)。另请注意,三元运算符有一个lower precedence,而不是逻辑或或关系比较,因此您可以将=? 之间的所有内容都放在(另一组)括号中。

【讨论】:

  • 感谢您的快速回复。我理解有增量的部分,但我很难理解在那之前的部分。我不应该也考虑逻辑 OR 运算符吗?因此,如果我插入数字,则为 d = (3+2 >7) || 7 > 2 ? 7:7;所以也许我的问题是:我必须以什么顺序“阅读”这行代码?
  • @Phonzy 查看编辑...这可能会更清楚地说明问题。
  • 我们收到如此多关于++-- 的问题重复出现的一个原因是学生被错误地教导。 “……他们在表达式的值被赋值之后做什么”是不正确的:C 实现可能会在赋值之前、期间或之后执行递增或递减。正确的说法是表达式使用自增或减量之前的操作数的值,而不管增减何时发生。每个被错误教导的学生都是另一个必须在以后纠正的人。
  • @EricPostpischil 您的精确度一如既往地受到赞赏。希望我所做的编辑可以改善帖子。
【解决方案2】:

表达式被解析为

d = ((b+c >a) || a > c) ? a-- : a++;

所以d 得到a—a++ 的结果,在这两种情况下都是7。区别在于表达式计算后a 的值。

|| 强制从左到右进行评估,因此首先评估 b+c > a。因为b+c5,所以表达式的结果是假的(0),所以a > c 被求值。该表达式的结果为真(1),因此(b+c > a) || a > c 的结果为真(1),这意味着我们将a— 的结果分配给d。因此d 将是7a 将是6

【讨论】:

    【解决方案3】:

    这就是 C 中运算符优先级的工作原理

    第一步

    d = (3 + 2 > 7) || 7 > 2 ? a-- : a++;
    

    第 2 步

    d = false || true ? a-- : a++;
    

    第 3 步

    d = true ? a-- : a++;
    

    这里 'a' 的值会被改变,但不会在这个语句中,所以 'a' 的值仍然是 7 但是如果你在其他语句中打印a,它会变成6。

    要了解有关运算符优先级的更多信息https://en.cppreference.com/w/c/language/operator_precedence

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-06
      • 2014-06-03
      • 2021-03-29
      • 2013-07-31
      • 2015-08-29
      • 1970-01-01
      • 2013-02-24
      • 2017-06-02
      相关资源
      最近更新 更多