我们在条件三元运算符中使用逗号时发现的东西?

时间:2012-02-08 07:55:36

标签: c++ ternary

好吧,我在三元运算符中有一个关于逗号的问题。 切掉垃圾,代码如下:

void test_comma_in_condition(void)
{
    int ia, ib, ic;

    ia = ib = ic = 0;
    bool condition=true;

    cout<<"Original:"<<endl;
    cout<<"ia: "<<ia<<endl;
    cout<<"ib: "<<ib<<endl;
    condition?(ia=1, ib=2):(ia=11, ib=12);
    cout<<"After:"<<endl;
    cout<<"ia: "<<ia<<endl;
    cout<<"ib: "<<ib<<endl;

    ia = ib = ic = 0;
    condition?ia=1, ib=2, ic=3:ib=22,ia=21, ic=23;
    cout<<"The operation must be bracketed, or you'll see..."<<endl;
    cout<<"ia: "<<ia<<endl;
    cout<<"ib: "<<ib<<endl;
    cout<<"ic: "<<ic<<endl;

    condition?ia=1, ib=2, ic=3:ia=21, ib=22, ic=23;
    cout<<"The operation must be bracketed, or you'll see..."<<endl;
    cout<<"ia: "<<ia<<endl;
    cout<<"ib: "<<ib<<endl;
    cout<<"ic: "<<ic<<endl; 

    return;
}

输出将如下:

Original:
ia: 0
ib: 0
After:
ia: 1
ib: 2
The operation must be bracketed, or you'll see...
ia: 21
ib: 2
ic: 23
The operation must be bracketed, or you'll see...
ia: 1
ib: 22
ic: 23

这合法吗?

4 个答案:

答案 0 :(得分:8)

这是运营商优先权的问题。你的表达:

condition?ia=1, ib=2, ic=3:ib=22,ia=21, ic=23;
编译器将

理解为:

(condition?(ia=1, ib=2, ic=3):(ib=22)),ia=21, ic=23;

此时你应该能够看到为什么你得到程序输出。

答案 1 :(得分:5)

是的,条件表达式的相关语法是:

logical-or-expression ? expression : assignment-expression

用于赋值表达式(也可以是条件表达式 throw-expression ):

logical-or-expression assignment-operator assignment-expression

对于带逗号运算符的表达式(赋值表达式也可以是表达式):

expression , assignment-expression

这意味着无法将构造a ? b : c, d解析为等同于a ? b : (c, d),因为c, d不是赋值表达式,但必须解析为等效于(a ? b : c), d

condition ? ia=1,ib=2,ic=3 : ia=21, ib=22, ic=23;中没有未定义的行为,因为condition的评估在评估?:的第二个或第三个操作数之前以及包含逗号运算符的每个子表达式中都被排序在评估第二个操作数之前,对逗号运算符的第一个操作数的求值进行排序。

答案 2 :(得分:3)

这是合法的,但愚蠢对编写这样的代码不是很有用。

代码

condition?ia=1, ib=2, ic=3:ia=21, ib=22, ic=23;

相当于

condition?(ia=1, ib=2, ic=3):ia=21;
ib=22;
ic=23;

更难阅读。

答案 3 :(得分:1)

问题是逗号运算符有the lowest precedence there is。多亏了这一点,条件运算符的else部分只是第一个赋值,之后逗号运算符启动,其他两个语句也将被执行。