1

好吧,我对三元运算符中的逗号有疑问。废话少说,代码如下:

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

4 回答 4

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;

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

于 2012-02-08T08:02:18.440 回答
6

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

logical-or-expression ? expression : assignment-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计算在计算 的第二个或第三个操作数之前排序,?:并且在每个包含逗号运算符的子表达式中,逗号运算符的第一个操作数的计算在第二个计算之前排序操作数。

于 2012-02-08T08:07:16.793 回答
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;

只是更难阅读。

于 2012-02-08T08:06:46.580 回答
1

问题是逗号运算符的优先级最低。多亏了这一点,else条件运算符的部分只是第一个赋值,之后逗号运算符开始执行,其他两个语句也将被执行。

于 2012-02-08T08:05:24.610 回答