【问题标题】:So you think you know the priority of operators in c++? [closed]所以你认为你知道c++中运算符的优先级吗? [关闭]
【发布时间】:2010-01-28 12:37:17
【问题描述】:

我刚刚遇到了一段代码,它不仅可以编译,而且给出了预期的结果(其中 x 是一个整数值):

int y = (int)(0.5 * x * x + + + 0.6 * x + 1.2);

我花了一段时间才弄清楚发生了什么,我必须说这是一个有趣的操作员问题。在不编译程序的情况下,以下操作的结果是什么,为什么?

int a = 1;
int b = 2;
int z = a + + + b;
int z1 = a + - + b;
int z2 = a + - - b;
int z3 = a - - + b;
int z4 = a - - - b;
int z5 = a +- b;

不过,我还有一个问题:标准是否给出了这样的结果,还是特定于编译器?


说明: 因为 + 和 - 运算符之间有空格,所以 "++ +" 序列没有编译为 "++ +",而是作为右成员上的一元运算符。所以

int y = (int)(0.5 * x * x + + + 0.6 * x + 1.2);

实际上给出:

int y = (int)(0.5 * x * x + 0.6 * x + 1.2);

这是预期的结果。

所以,

z  = a + + + b = a + + (+b) = a + (+b) = a + b = 3;
z1 = a + - + b = a + - (+b) = a + (-b) = a - b = -1;
z2 = a + - - b = a + - (-b) = a + (+b) = a + b = 3;
z3 = a - - + b = a - - (+b) = a - (-b) = a + b = 3;
z4 = a - - - b = a - - (-b) = a - (+b) = a - b = -1;
z5 = a +- b = a + (-b) = a - b = -1;

【问题讨论】:

  • 给出“预期值”?它是否会在屏幕上打印一条信息说“可以编译,但我不知道你为什么想要它”?这就是我所期望的。
  • 对人工编码测验不太感兴趣,谢谢。
  • 如果结果真的符合预期,你就不会问这个问题了。
  • 找出谁写的,踢他们,告诉他们不要再这样做了。为什么人们会写这种东西?
  • @Prasoon 代码中没有“+++” - 这些大多是一元 + 和 - 操作。

标签: c++ operators


【解决方案1】:

按照标题的形式回答问题:

那么你认为你知道 c++ 中运算符的优先级吗?

不,我不这么认为,而且我也无意学习它。阅读时不确定时,我会检查文档,写作时不确定时,我会使用括号。我需要我的记忆来记住更重要的事情。

【讨论】:

  • 在现实世界中,所有的测验都是开卷的。 (或者,正如我的一位老师常说的,“开放邻居”。)
  • 不止一次,在阅读的时候,我以为我知道了,但实际上我没有并且错过了其他人制造的错误。所以我更愿意知道...
  • 更不用说,如果我知道优先级,我会在某个时候依赖它。要么我会弄错(我的记忆力不如我记得的那么好),要么我会混淆其他人。我总能查到。
【解决方案2】:

[source] 一元 +/- 比加/减 +/- 绑定更紧密,并且关联正确。于是……

int a = 1;
int b = 2;
int z = a + + + b; // equivalent to a + (+(+b))
int z1 = a + - + b; // equivalent to a + (-(+b))
int z2 = a + - - b; // equivalent to a + (-(-b)) = a + b
int z3 = a - - + b; // equivalent to a - (-(+b)) = a + b
int z4 = a - - - b; // equivalent to a - (-(-b)) = a - b
int z5 = a +- b; // equivalent to a + (-b) = a - b

【讨论】:

    【解决方案3】:

    z = 3
    z1 = -1
    z2 = 3
    z4 = 3
    z5 = -1

    如果不编译,我会说这是一个简单的数学运算符组合
    我是用这句话学的(翻译自巴西葡萄牙语):

    不同符号 = 减法
    等号 = 添加

    所以

    int z = a + + + b; // '+' + '+' = '+' , the resulting '+' + '+' = + again.
    int z1 = a + - + b; // '+' + '-' = '-' , the resulting '-' + '+' = - again.
    int z2 = a + - - b; // '+' + '-' = '-' , the resulting '-' + '-' = +.
    int z3 = a - - + b; // '-' + '-' = '+' , the resulting '+' + '+' = + again.
    int z4 = a - - - b; // '-' + '-' = '+' , the resulting '+' + '-' = -.
    int z5 = a +- b; //simple "different signals = subtract" :)
    

    【讨论】:

    • 现在编译了,真的是这样。 :)
    【解决方案4】:

    为了回答您的问题,答案不是特定于编译器的。它既不是实现定义的,也不是未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2013-02-24
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多