【问题标题】:Why `(a-- > 0)` and `((a--) > 0)` are same?为什么`(a--> 0)`和`((a--) > 0)`是一样的?
【发布时间】:2011-02-03 09:23:16
【问题描述】:

程序如下

main()
{
int a=1;
if( a-- > 0)
   printf("AAAA");
else
   printf("BBBB");
}

它的输出是AAAA 如果我使用

main()
{
int a=1;
if( (a--) > 0)
   printf("AAAA");
else
   printf("BBBB");
}

那么为什么输出又是AAAA()-- 有更多偏好。

【问题讨论】:

  • a-- 实现为int postInc( int& a ) { int tmp = a; a = a-1; return tmp } 可能对您有所帮助,括号也不会重新评估变量。
  • 有趣的事实:你也可以说(a --> 0),解析器不在乎;)

标签: c++ c operators


【解决方案1】:

后缀运算符-- 比任何布尔比较运算符都具有higher precedence

您的期望是什么? a-- 始终计算为 a 的值,该值在计算后递减。

【讨论】:

  • 那么它必须递减才能进行比较。
  • 如果你想减少使用--a,而不是a----a 将 a 递减,然后计算为 a 的新值。 a-- 在递减之前计算为 a 的值。
【解决方案2】:

后缀-- 运算符返回变量的原始值,即使在递减之后也是如此。

所以是的,a 在比较之前递减,但是表达式a--的结果是不是 a,而是值1 .

【讨论】:

  • 不,严格来说,增量不一定发生在比较之前。发生自增操作的点只被强制在下一个序列点之前,只要这适合编译器。
  • @Jens,说得好。不过,这种解释更深了一层,我想我只是想强调一下,如果您在比较之前再次访问aa 已经减少了。
【解决方案3】:

-- 在表达式中使用变量后将其值递减。

【讨论】:

  • () 与此无关。
【解决方案4】:

此处使用括号对代码没有任何影响,因为有括号和没有括号的计算顺序相同。您是正确的,括号的优先级高于--。但是,在这种情况下,括号不会改变计算顺序,因为您没有按照与它们自然计算的顺序不同的顺序对操作数进行分组。

【讨论】:

    【解决方案5】:

    这里是 C++ 中所有 operator's precedence 的链接。

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 2013-08-24
      • 1970-01-01
      • 2016-06-02
      • 2015-05-04
      • 2015-09-03
      • 2014-01-05
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多