C++ 我们在条件三元运算符中使用逗号时发现了什么?

C++ 我们在条件三元运算符中使用逗号时发现了什么?,c++,ternary,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: "<&

我有一个关于三元运算符中逗号的问题。 废话少说,代码如下:

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;
}

这合法吗

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

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;

此时,您应该能够了解为什么会获得程序输出。

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

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;

此时,您应该能够了解为什么会获得程序输出。

问题在于逗号运算符有错误。有鉴于此,条件运算符的
else
部分只是第一个赋值,之后逗号运算符开始执行,其他两个语句也将执行。

问题是逗号运算符没有。有鉴于此,条件运算符的
else
部分只是第一个赋值,之后逗号运算符开始执行,其他两个语句也将执行。

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

代码

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;
只是更难阅读。

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

代码

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;

更难阅读。

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

logical-or-expression ? expression : assignment-expression
对于赋值表达式(也可以是条件表达式或抛出表达式):

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

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


条件中没有未定义的行为?ia=1,ib=2,ic=3:ia=21,ib=22,ic=23
因为对
条件的求值是在对
的第二个或第三个操作数求值之前排序的:
并且在每个包含逗号运算符的子表达式中,对逗号运算符的第一个操作数的求值是在对第二个操作数求值之前排序的。

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

logical-or-expression ? expression : assignment-expression
对于赋值表达式(也可以是条件表达式或抛出表达式):

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

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


条件中没有未定义的行为?ia=1,ib=2,ic=3:ia=21,ib=22,ic=23
因为对
条件的求值是在对
的第二个或第三个操作数求值之前排序的:
并且在每个包含逗号运算符的子表达式中,对逗号运算符的第一个操作数的求值是在对第二个操作数求值之前排序的。

您是说
a?b:c,d
应该是指
a吗?b:(c,d)
而不是
(a?b:c),d
。在不讨论哪个是正确的问题的情况下,你怀疑编译器的原因是什么?是的,它是合法的,但也不可读。你说的是
a?b:c,d
应该是指
a吗?b:(c,d)
而不是
(a?b:c),d
。在不讨论哪一个是正确的问题的情况下,您怀疑编译器的原因是什么?是的,它是合法的,但也不可读。扮演魔鬼代言人,但如果这是一个优先级问题,为什么
似乎比
具有更高的优先级?:
在“中间”是条件表达式的一部分,但条件表达式尾部的优先级较低?我希望您的答案是正确的,因为它回答了这个问题-逗号表达式是
表达式
的一部分,但不是
赋值表达式
的一部分。您不能在这里真正调用优先级。形式上,C++运算符不是按优先级排序的,而是由语法中的不同乘积排序的。大多数情况下,其效果与标准中产品呈现顺序对应的优先级相同,但至少有两个例外:此处(第二项可以是任何表达式),在某些情况下涉及C样式强制转换和前缀运算符。@JamesKanze如果一种几乎是C++但不完全是C++的语言具有优先权,并使用它来解决语法中的歧义,那么这不是一个行为会有所不同的示例,因为表达式
a?B,C:D < /C> >首先不含糊。@如果使用优先级定义C++,则< >代码>?b:c,d组
a组?b:(c,d)
a?b,c:d
将是非法的。扮演魔鬼代言人,但如果这是一个优先权问题,为什么
似乎比
具有更高的优先权?:
在“中间”是条件表达式的一部分,但条件表达式尾部的优先级较低?我希望您的答案是正确的,因为它回答了这个问题-逗号表达式是
表达式
的一部分,但不是
赋值表达式
的一部分。您不能在这里真正调用优先级。形式上,C++运算符不是按优先级排序的,而是由语法中的不同乘积排序的。大多数情况下,其效果与标准中产品呈现顺序对应的优先级相同,但至少有两个例外:此处(第二项可以是任何表达式),在某些情况下涉及C风格的强制转换和前缀运算符。@JamesKanze如果一种几乎是C++但不完全是C++的语言具有优先权,并使用它来解决语法中的歧义,那么这不是一个例子