关于问题 ?并且:在c ++中

ass*_*ler 9 c++ ternary-operator conditional-operator

为什么这句话:

int a = 7, b = 8, c = 0;
c = b>a?a>b?a++:b++:a++?b++:a--;
cout << c;
Run Code Online (Sandbox Code Playgroud)

不等于:

int a = 7, b = 8, c = 0;
c = (b>a?(a>b?a++:b++):a++)?b++:a--;
cout << c;
Run Code Online (Sandbox Code Playgroud)

并且等于:

int a = 7, b = 8, c = 0;
c = b>a?(a>b?a++:b++):(a++?b++:a--);
cout << c;
Run Code Online (Sandbox Code Playgroud)

请给我一些理由.为什么?

sth*_*sth 15

因为? :是从右到左的联想.它的定义与语言中的相似.


Pau*_*lin 7

我相信@sth提供了正确的答案,但是,我认为@Skilldrick在评论中说得对 - 为什么你会写这样的东西.

除了优先级问题之外,在单个语句中递增相同变量时,您确实需要小心.声明中可能有也可能没有序列点,因此可能无法保证增量的评估顺序.您可能会在同一编译器上使用不同的编译器甚至不同的优化设置得到不同的结果.

  • 绝对 - 在同一序列点的同一变量的多个增量是可怕的*未定义的行为*.这条线可能在法律上等于其中任何一条. (2认同)