C++ 与?一起使用时逗号运算符的优先级:操作人员

C++ 与?一起使用时逗号运算符的优先级:操作人员,c++,c,operator-precedence,comma-operator,C++,C,Operator Precedence,Comma Operator,我不知道为什么下面两个子项目的结果不同: int a , b; a = 13, b=12; (a > b)? (a++,b--):(a--,b++); // Now a is 14 and b is 11 a = 13, b=12; (a > b)? a++,b-- : a--,b++; // Now a is 14 but b is 12 但是,对于这些情况,结果是相同的: a = 13, b=12; (a <

我不知道为什么下面两个子项目的结果不同:

    int a , b;

    a = 13, b=12;
    (a > b)? (a++,b--):(a--,b++); // Now a is 14 and b is 11

    a = 13, b=12;
    (a > b)? a++,b-- : a--,b++;   // Now a is 14 but b is 12
但是,对于这些情况,结果是相同的:

    a = 13, b=12;
    (a < b) ? a++,b-- : a--,b++; // Now a is 12 and b is 13

    a = 13, b=12;
    (a < b) ? (a++,b--) : (a--,b++); // Again a is 12 and b is 13
a=13,b=12;
(a
为什么括号对
“?”之后的语句有区别,而对
之后的语句没有区别:“
?你有什么想法吗?

这个:

(a > b)? a++,b-- : a--,b++; 
相当于:

((a > b) ? (a++, b--) : a--), b++;
所以
b
总是递增的,只是有时递减。除了“等效于”表达式中的括号外,无法解析
之间的逗号运算符。但是在
之后,未加冠词的逗号终止三元
?:
运算符,并将增量保留为无条件执行。逗号运算符的优先级非常非常低。

在这种情况下

(a > b)? a++,b-- : a--,b++; 
相当于

((a > b)? a++,b-- : a--),b++; 

我猜是因为
x?y
不能被视为有效的表达式,因此逗号不能在此处拆分运算符<代码>x?y:z</c>是一个有效的表达式,冒号后的逗号可以分成两个表达式。

< p> C++语法的相关部分是:

条件表达式:
逻辑或表达式
逻辑还是表达式?表达式:赋值表达式
赋值表达式:
条件表达式
逻辑或表达式赋值运算符赋值表达式
抛出表情
表达式:
赋值表达式
表达式,赋值表达式
总之,虽然条件表达式的“中间”可以是扩展到
的完整表达式,但最后一个子表达式只能是赋值表达式,不包括使用逗号运算符的表达式(逗号运算符显示为赋值表达式(如带括号的主表达式)的有效子表达式的一部分或另一个条件表达式的第二个操作数的情况除外)

在C语言中,最后一个子表达式更受限制,它甚至不能是赋值表达式,尽管在您的示例中这不是一个问题

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

还有一个理由,不使用逗号,这是来自C++标准,因为“抛出表达式”不是C的一部分,但是问题是双重标记的,所以它是有效的。@ JONAATEN LIFFLLER:是的,它确实有。C和C++条件操作符语法之间有重要区别;我浏览C++问题,没有NoTIC。在C标签上加e。