三元条件和赋值运算符优先级

Jos*_*ica 32 c++ conditional-operator operator-precedence

我对直接赋值和三元条件运算符优先级感到困惑:

#include<stdio.h>
int main(void)
{
    int j, k;

    j = k = 0;
    (1 ? j : k) = 1; // first
    printf("%d %d\n", j, k);

    j = k = 0;
    1 ? j : k = 1; // second
    printf("%d %d\n", j, k);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

1 0
1 0
Run Code Online (Sandbox Code Playgroud)

但它碰巧是:

1 0
0 0
Run Code Online (Sandbox Code Playgroud)

另外我得到这个警告:

main.cpp:20:warning:语句无效

这是我评论的第二行.

由于直接赋值运算符的优先级低于三元条件运算符,因此我期望将第一行和第二行注释为等效的行.但实际情况并非如此.

我用g ++ --version(Ubuntu 4.4.3-4ubuntu5)4.4.3尝试了这个

Sum*_*uma 20

C/C++语言中的运算符优先级未由表或数字定义,而是由语法定义.这是条件运算符的语法,来自C++ 0x草案章节5.16条件运算符[expr.cond]:

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

因此,当您在doublecolon的左侧使用赋值时,像这样的优先表是正确的,但在右侧使用时则不是.我不知道这种不对称的原因是什么.这可能是一个历史原因:在C中,条件结果不是左值,因此为它分配一些东西是没有意义的,并且允许在没有括号的情况下接受赋值可能看起来很聪明.

  • @foxcub表的当前版本是正确的.赋值与表中的条件具有相同的优先级,并且关联性从右到左,导致赋值在条件之前正确完成.表格[答案时不正确](http://en.cppreference.com/mwiki/index.php?title=cpp/language/operator_precedence&oldid=5400),表明条件优先于赋值. (2认同)

Ker*_* SB 14

第二行相当于:

1 ? (j) : (k = 1);
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

j;
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

;
Run Code Online (Sandbox Code Playgroud)

关键是三元条件运算符的两个操作数可以是表达式,因此运算符优先级在这里不相关.只是第二个操作数是赋值表达式k = 1.

  • 你是对的,但问题是:为什么它相当于1?(j):( k = 1); 当条件被认为具有比赋值更高的优先级时,而不是(1?j:k)= 1? (7认同)
  • 涉及多个运算符(赋值也是运算符).您没有解释为什么赋值表达式优先于条件表达式(并且常用的优先级表也不解释它). (3认同)

iam*_*ind 8

(1 ? j : k) = 1;
Run Code Online (Sandbox Code Playgroud)

相当于,

if(true) j = 1;
else k = 1;
Run Code Online (Sandbox Code Playgroud)

和,

1 ? j : k = 1;
Run Code Online (Sandbox Code Playgroud)

相当于,

if(true) j;  // warning: statement has no effect
else k = 1;
Run Code Online (Sandbox Code Playgroud)