逗号运算符优先使用时? :运营商

时间:2013-05-31 09:24:24

标签: c++ c comma operator-precedence

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

    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

为什么括号会在"?"之后对语句产生影响,但对":"之后的语句没有区别?你有什么想法吗?

4 个答案:

答案 0 :(得分:24)

这一个:

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

相当于:

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

所以b总是递增,有时只会递减。除了在'equivalent to'表达式中括号外,无法在?:之间解析逗号运算符。但是在:之后,未加密码的逗号终止了三元?:运算符,并将增量保留为无条件执行。逗号运算符的优先级非常非常低。

答案 1 :(得分:4)

C ++语法的相关部分是:

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression
assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator assignment-expression
    throw-expression
expression:
    assignment-expression
    expression, assignment-expression

总之,虽然条件表达式的“中间”可以是一个延伸到:的完整表达式,但最后一个子表达式只能是赋值表达式,使用逗号运算符排除表达式(除了逗号运算符作为赋值表达式的有效子表达式的一部分出现的位置,例如带括号的 primary-expression 或作为另一个条件表达式的第二个操作数。)

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

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

答案 2 :(得分:3)

在这种情况下

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

相当于

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

答案 3 :(得分:2)

我想这是因为x ? y不能被认为是有效的表达式,因此逗号不能将运算符拆分。 x ? y : z是一个有效的表达式,冒号后的逗号可以分成两个表达式。