2012-02-08 119 views
0

那么,我有一个关于三元运算符逗号的问题。 废话少说,代码如下:在条件三元运算符中使用逗号时发现的东西?

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 

这是合法的吗?

+2

你在说'a? b:c,d'应该是'a? b:(c,d)'而不是'(a?b:c),d'。在不了解哪个是正确的问题的情况下,您怀疑编译器的原因是什么? – hvd 2012-02-08 08:02:43

+3

是的,它是合法的 - 但也是不可读的。 – 2012-02-08 08:04:31

回答

7

这是一个运算符优先级的问题。你的表情:

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; 

在这一点上,你应该能够明白为什么你的程序的输出。

+0

扮演魔鬼的拥护者,但是如果这是一个优先问题,为什么'''在条件表达式的“中间”似乎具有比'::'更高的优先级,但是条件表达式的尾部具有更低的优先级? – 2012-02-08 08:22:04

+0

我为你的答案+1了,因为它回答了这个好问题 - 逗号表达式是“表达式”的一部分,但不是“赋值表达式”的一部分。 – 2012-02-08 08:26:53

+0

你不能在这里调用优先级。形式上,C++操作符不是按优先顺序排序,而是按语法中的不同生成顺序排列。大多数情况下,效果与具有与标准中呈现产品的顺序相对应的优先顺序相同,但至少有两个例外:此处(其中第二项可以是_any_表达式)和一些涉及C风格转换和前缀运算符的情况。 – 2012-02-08 08:30:07

1

问题是,逗号运算符有the lowest precedence there is。由于这个原因,条件运算符的else部分只是第一个赋值,之后逗号运算符开始执行,另外两个语句也将被执行。

2

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

代码

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; 

只是更难阅读。

+0

另一个问题?这里逗号是如何分析的?或者如何使用逗号? – Joseph 2012-02-16 01:20:45

+0

逗号运算符可以用来分隔表达式,就像它在这里所做的那样。与分号不同,*表达式终止,逗号允许你在一个地方有几个表达式,否则只允许一个表达式。在实践中不是非常有用,可能会给读者造成混淆。 – 2012-02-16 06:38:32

5

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

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评价任?:第二或第三操作数的评价含有逗号操作符逗号运算符的所述第一操作数的评价是之前和在每个子表达测序在评估第二个操作数之前进行排序。

+0

非常感谢,也许我需要一些关于表达和分配表达的东西。 – Joseph 2012-02-16 01:19:43