繁体   English   中英

三元运算符中的赋值

Assignment in ternary operator

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

对于三元运算符,为什么会编译以下内容:

a > b ? a=4 : ' ';

但这个没有:

a > b ? ' ' : b=4;

左值需要作为赋值的左操作数

也就是说,是什么使true情况与分配的false情况不同?

3 个回复

它与条件运算符的正式定义有关。 来自C 标准的第 6.5.15 节:

 conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression

条件的第二个子句可以是任何表达式,而第三个子句只能是条件表达式(其中赋值不是)。 换句话说,条件运算符?:优先级高于赋值运算符=

所以这个:

a > b ? a=4 : ' '

是不是和这个一样:

(a > b) ? (a=4) : (' ')

但是这个:

a > b ? ' ' : b=4;

与此相同:

((a > b) ? (' ') : b)=4;

并且不能将条件运算符的结果分配给(即它不是左值),因此您会收到错误消息。

如果添加括号,您可以获得编译的内容:

a > b ? ' ' : (b=4);

当然,这些语句看起来不是条件的最佳用例,应该重写为:

if (a>b) a=4;

并且:

if (a<=b) b=4;

:? 运算符优先级高于赋值运算符。 所以后者相当于:

(a > b ? ' ' : b)=4;

这显然是非法的。

在这种情况下,您应该知道 C 和 C++ 之间存在本质区别。:)

在 C 中,条件(三元)运算符的定义如下

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

而在 C++ 中

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

所以在 C 这个语句中

a > b ? ' ' : b=4;

相当于

( a > b ? ' ' : b ) = 4;

因此编译器会发出错误,因为您可能未将值分配给其他值。

来自 C 标准(6.5.15 条件运算符)

4 评估第一个操作数; 在它的求值和第二个或第三个操作数(以求值为准)的求值之间有一个序列点。 仅当第一个操作数不等于 0 时才计算第二个操作数; 仅当第一个操作数等于 0 时才计算第三个操作数; 结果是第二个或第三个操作数(以求值者为准)的值,转换为下面描述的类型

在 C++ 中,此语句等效于

a > b ? ' ' : ( b=4 );

并且是一个有效的陈述。

这是一个演示程序

#include <iostream>

int main() 
{
    int a = 0, b = 1;
    
    a > b ? ' ' : b=4;
    
    std::cout << "b = " << b << '\n';
    
    return 0;
}

它的输出是

b = 4
1 三元运算符内部的赋值

是否可以在三元运算符(条件运算符)的第一个操作数内定义变量? 一个常规的 if 语句可以做到这一点, 这可以用三元运算符完成吗? 我想它看起来像, 如果这是唯一的选择,我愿意使用像 boost 这样的库 ...

2021-04-21 11:24:09 2 79   c++
3 三元运算符和赋值

我试图使用三元If运算符在我的VB.NET项目中保存唯一的代码行,但会抛出: “指定的演员表无效” ...

2018-12-31 16:40:25 2 45   vb.net
4 使用三元运算符赋值?

我在 Perl 5.8 上,需要分配一个默认值。 我最终这样做了: $model-&gt;test的值将是"1"或未定义。 如果$model-&gt;test ,请将$review设置$review "1"否则将其设置为等于'' 。 因为它不是 Perl 5.10,所以我不能使用新的时髦的定 ...

5 三元运算符中的赋值,反模式? [关闭]

我有一个以这种方式使用三元运算符的同事(在javascript中): 在C#中,我只是这样做。 我的同事说这是JavaScript编码约定...是真的吗? 我不是Java语言专家,并且不喜欢这种语言。当我查看代码时,我专注于我的左手边跟随变量的初始化或赋值,这种风格迫使我阅读整 ...

8 无法使用三元运算符赋值

我需要根据从另一个var获得的值为var赋值,但是它给了我undefined。 我需要根据您提前预订的日期给予折扣,例如 情况是我需要计算今天和arriveDate日之间的天arriveDate 。 这没有问题(但欢迎任何评论) 在js我这样做 现在,我需要根据预订 ...

10 三元和赋值运算符优先级

在MSVC v9.0上,如果我这样做: 那么似乎?:在'='之前被求值。 这是保证吗? 我将此表用作参考: http : //en.cppreference.com/w/cpp/language/operator_precedence 但是,两个运算符都在同一行中,因此我不确定 ...

2012-10-10 15:51:47 4 193   c++
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM