13

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

    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

4 回答 4

24

这个:

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

相当于:

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

sob总是递增,只是有时递减。除了“等价于”表达式中的括号外,没有其他方法可以解析?和之间的逗号运算符。:但是在 之后:,未加括号的逗号终止了三元?:运算符并将增量保留为无条件执行。逗号运算符的优先级非常非常低。

于 2013-05-31T09:28:12.133 回答
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

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

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

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression
于 2013-05-31T09:39:01.333 回答
3

在这种情况下

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

它相当于

((a > b)? a++,b-- : a--),b++; 
于 2013-05-31T09:28:46.050 回答
2

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

于 2013-05-31T09:29:01.717 回答