【问题标题】:Operators evaluation运营商评价
【发布时间】:2016-04-29 13:53:20
【问题描述】:

此代码的计算结果为 true:

#include <iostream>


int main(){
 int x = 9;
 int j = x-1;

 if(x - j+1 > 1)
  std::cout << "Ehhhh???\n";
}

但是这个是假的:

#include <iostream>

int main(){
 int x = 9;
 int j = x-1;

 if(x - (j+1) > 1)
  std::cout << "Ehhhh???\n";
}

加号和减号运算符的优先级高于“

【问题讨论】:

  • 在编写 C++ 时不要标记 c。谢谢。
  • “我也只使用一种数据类型,所以应该[没有]溢出。” 这是不合理的。这两件事基本上没有任何关系。

标签: c++ operators


【解决方案1】:

这实际上只是将 1 添加到什么值。加法和减法具有从左到右的关联性,因此我们从左到右开始。

x - j + 1
(9 - 8) + 1
1 + 1
2

在哪里

x - (j + 1)
9 - (8 + 1)
9 - 9
0

强制附加到j 而不是x-j 所以第二种情况是正确的错误。

【讨论】:

  • 我认为“当将 1 添加到 j 时”具有误导性。在第一种情况下,实际上将 1 添加到 x 或从 j 中减去
  • @Slava 这样更好吗?我很难找出一个好方法来说明何时进行添加。除非你觉得没问题。
【解决方案2】:

由于算术+和-的优先级相同,但结合性是从左到右,所以没有括号的会先减法再加法,即:

x - j+1 ==2 //here the operation is performed from left to right,subtraction first then addition
x - (j+1)==0 //here the one inside the parenthesis will be done first,i.e addition first then subtraction

【讨论】:

    【解决方案3】:

    从数学上讲,您有 2 个不同的表达式:

    x - j + 1 is equal to  x - ( j - 1 )
    

    x - ( j + 1 ) is equal to x - j - 1 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2017-02-12
      • 2011-05-16
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多