右侧的三元/空合并运算符和赋值表达式?

Posted

技术标签:

【中文标题】右侧的三元/空合并运算符和赋值表达式?【英文标题】:Ternary/null coalescing operator and assignment expression on the right-hand side? 【发布时间】:2012-01-13 05:30:56 【问题描述】:

在 C# 中尝试使用三元和空值合并运算符时,我发现可以在表达式的右侧使用赋值,例如这是一个有效的 C# 代码:

int? a = null;
int? b = null;
int? c = a ?? (b = 12);
int? d = a == 12 ? a : (b = 15);

奇怪的是,不仅表达式右侧的赋值被评估为它自己的右侧(这意味着这里的第三行被评估为12,而不是像b = 12 => void这样的东西) ,但这种赋值也有效,因此在一个语句中分配了两个变量。也可以使用此赋值右侧的任何可计算表达式,以及任何可用的变量。

这种行为在我看来很奇怪。我记得在 C++ 中使用 if (a = 2) 而不是 if (a == 2) 比较时遇到了麻烦,它总是被评估为 true,这是从 Basic/Haskell 切换到 C++ 后的常见错误。

它是一个文档化的功能吗?有什么名字吗?

【问题讨论】:

注意括号... if(2 == (a =2 )) .... 【参考方案1】:

这是assignment operator 也返回值的结果:

赋值运算符 (=) 将其右侧操作数的值存储在由其左侧操作数表示的存储位置、属性或索引器中,并将该值作为结果返回。

表达式b = 12不仅将12赋给b,还返回了这个值。

【讨论】:

【参考方案2】:

在 C# 中可以进行多重赋值:

int a;
int b;
int c;
a = b = c = 5;
//all variables = 5;

if(6 == (c = 6))
   //this will be true;

如果你把一个变量放在方程的右边,即使它刚刚在同一行被赋值,它也会返回它的值/引用。

【讨论】:

以上是关于右侧的三元/空合并运算符和赋值表达式?的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符

在 C# 三元运算符中给出错误:只有赋值、调用、递增、递减和新对象表达式可以用作语句

在C#三元运算符给出错误:只有赋值,调用,递增,递减和新对象表达式可用作语句

三元运算符

补充知识:三元运算和逻辑运算

C#语法糖空合并运算符??和空合并赋值运算符 ??=