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

时间:2010-01-28 12:37:18

标签: c++ operators

我刚碰到一段代码,不仅编译,而且给出了预期的结果(其中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;

4 个答案:

答案 0 :(得分:20)

回答标题中提出的问题:

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

不,我不这么认为,甚至更多,我无意去学习它。每当读书时不确定,我会检查文档,在写作时不确定,我会使用括号。我需要记忆才能记住更重要的事情。

答案 1 :(得分:4)

[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

答案 2 :(得分:2)

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" :)

答案 3 :(得分:2)

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