为什么“ - - ”和“+ ++”以不同的方式运作?

时间:2014-03-03 12:27:00

标签: c++ increment operator-precedence decrement

Decrementation / Incrementation是一项基本操作,但它对- --+ ++的优先权让我感到困惑。我将使用减量来说明:

我在ab之间有一套不同的操作方式:See it working here

#include <iostream>
using namespace std;
int a=10, b=7;
int main() {
// - and -- opearator                         // Results:  Details:
    a = 10, b = 7; cout << a---b << endl;     //    3      a post-decrement        
    a = 10, b = 7; cout << a ---b << endl;    //    3      a post-decrement     
    a = 10, b = 7; cout << a- --b << endl;    //    4      b pre-decrement    
    a = 10, b = 7; cout << a-- -b << endl;    //    3      a post-decrement  
    a = 10, b = 7; cout << a--- b << endl;    //    3      a post-decrement 
    return 0;
    }

我理解4输出来自递减的b7转为6,并从a减去10 1}}。

另外,由于其他四个陈述,我认为编译器将它们全部视为---但是,这里出现了- --结果的混淆。 See it working here

5 个答案:

答案 0 :(得分:10)

解析遵循最大咀嚼规则,因此所有语句减去第三个都被解释为(a--)-b,递减a并返回其先前的值({{1} })。

第三个是10,它是a-(--b)的预递减,因此返回新的递减值。

答案 1 :(得分:2)

  

但是为什么它在声明之后没有减少呢?

因为--X运算符:

  • 首先执行减量
  • 然后返回递减的结果

所以,--b之后无法“递减”。它始终是“之前”。

  

混乱

仔细查看代码和结果:每次写---时没有空格,结果都是一样的:三。三也是-- -案例的结果。即使有一个纯粹的猜测,你可以说编译器将其解析为-- -。事实上,它实际上就是这样,因为C ++标准要求它这样做。查看有关“最大咀嚼”规则的评论。其他多字符运算符也是如此,例如++

在你将其拆分为- --的另一种情况下,编译器没有其他选择:由于中间的空间,它必须将其视为- --。就像-- -一样,这种情况很明显,并且完全可见哪个部分构成了--运算符,编译器必须遵守它。

答案 2 :(得分:2)

我认为这是因为Maximal Munch Rule。来自维基:

  

在计算机编程和计算机科学中,“最大的蒙克”或   “最长匹配”是在创建一些构造时的原则,如   应该消耗尽可能多的可用输入。

来自Expert C Programming

  

ANSI标准规定了一种后来被称为的约定   最大咀嚼策略。最大的蒙克说,如果还有更多   对于下一个标记的一种可能性,编译器将更喜欢   咬掉涉及最长字符序列的那个。

答案 3 :(得分:1)

该陈述相当于10-6 = 4, 休息等于9-7 = 3.

#include <iostream>
using namespace std;
int a=10, b=7;
int main() {
    // - and -- opearator               //  Results:  Details after a statement:
    cout << (a--)-b << endl; a=10, b=7;   //    3       Both a and b decremented
    cout << (a --)-b << endl; a=10, b=7;  //    3       Both a and b decremented 
    cout << a- (--b) << endl; a=10, b=7;  //    4       Neither a or b decremented
    cout << (a--) -b << endl; a=10, b=7;  //    3       Both a and b decremented
    cout << (a--)- b << endl; a=10, b=7;  //    3       Both a and b decremented
    return 0;
}

答案 4 :(得分:1)

在这一系列陈述中

cout << a---b << endl; a=10, b=7;   //    3       Both a and b decremented
cout << a ---b << endl; a=10, b=7;  //    3       Both a and b decremented 
cout << a- --b << endl; a=10, b=7;  //    4       Neither a or b decremented
cout << a-- -b << endl; a=10, b=7;  //    3       Both a and b decremented
cout << a--- b << endl; a=10, b=7;  //    3       Both a and b decremented

你忘了再说一句:)

cout << a --- b << endl; a=10, b=7;  //    3       Both a and b decremented

在所有这些陈述中

cout << a---b << endl; a=10, b=7;   //    3       Both a and b decremented
cout << a ---b << endl; a=10, b=7;  //    3       Both a and b decremented 
cout << a--- b << endl; a=10, b=7;  //    3       Both a and b decremented
cout << a --- b << endl; a=10, b=7;  //    3       Both a and b decremented

编译器将输出的表达式解析为

a-- -b

即尝试提取最长的有效令牌。

postdecrement运算符的值,例如a--,是递减前的操作数的值。所以在表达中

a-- -b

a--的值为10,b的值为7。差异等于3

你有唯一的表达式与预先生成运算符

cout << a- --b << endl; a=10, b=7;  //    4       Neither a or b decremented

--b的值是递减b6的值。因此,您10 - 6等于4

如果你在所有这些陈述中用负号替换加号,你将获得相同的效果

17
17
18
17
17
17  // this corresponds to my added statement a +++ b

所以这些操作 - 和+ ++的行为方式相同。