逗号操作符优先级,当使用?:运营商

Comma operator precedence while used with ? : operator

本文关键字:运营商 操作符 优先级      更新时间:2023-10-16

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

    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 > b)? a++,b-- : a--,b++; 

等价于:

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

所以b总是递增的,只是有时递减。没有办法解析?:之间的逗号操作符,除非将其括在"等效"表达式中。但是在:之后,没有括号的逗号终止了三进制?:运算符,并使自增运算符无条件执行。逗号操作符的优先级非常非常低。

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

总之,虽然一个条件表达式的"中产"可以是一个完整表达式扩展:,最后子表达式只能一个赋值表达式不包括表达式使用逗号操作符(除了逗号操作符作为有效的子表达式的一部分出现的赋值表达式如括号主元表达式第二操作数或另一个条件表达式)

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

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

在这种情况下

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

等于

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

我猜这是因为x ? y不能被认为是一个有效的表达式,因此逗号不能在那里分割操作符。x ? y : z为合法表达式,冒号后的逗号可以拆分为两个表达式