我写了以下代码。
static void Main(string[] args)
{
var xyz = 10 < 11 ? 12 : 5 < 21 ? getValue() : 15;
Console.WriteLine(xyz);
Console.ReadLine();
}
static int getValue()
{
Console.WriteLine("hello");
return 100;
}
由于第一个条件总是为真,因此xyz将得到的值为12,但由于条件运算符本身是右关联的,所以我期望首先执行getValue()函数并且&#34; hello&#34 ;会被打印出来。当我运行此代码时,它不会以这种方式运行。
有人可以告诉我这个行为。
答案 0 :(得分:4)
此:
var xyz = 10 < 11 ? 12 : 5 < 21 ? getValue() : 15;
被视为:
var xyz = 10 < 11 ? 12 : (5 < 21 ? getValue() : 15);
所以我们有一个条件表达式:
10 < 11
12
5 < 21 ? getValue() : 15
当10 < 11
为真时,将评估第一个分支,但不计算第二个分支。
关联性不像代码那样容易显示,代码对每个操作数使用bool
表达式 - 因为它可以使用任何关联性进行编译。
考虑以下代码:
using System;
class Test
{
static void Main()
{
var xyz = Log(1, true) ? Log(2, true) : Log(3, true) ? Log(4, false) : Log(5, true);
}
static bool Log(int x, bool result)
{
Console.WriteLine(x);
return result;
}
}
为简单起见,将每个Log(x, ...)
重命名为Lx
,我们有:
var xyz = L1 ? L2 : L3 ? L4 : L5;
可以这样处理:
// Right associativity
var xyz = L1 ? L2 : (L3 ? L4 : L5);
// Left associativity
var xyz = (L1 ? L2 : L3) ? L4 : L5;
鉴于我们正在返回的结果,我们希望看到输出为1,2,左边相关性,我们会看到1,2,4。实际输出为1,2,表现出正确的联想。
答案 1 :(得分:1)
如果将代码翻译成in..else语句,则为 -
int xyz = 0;
if (10 < 11)
{
xyz = 12;
}
else
{
if (5 < 21)
{
xyz = getValue();
}
else
{
xyz = 15;
}
}
由于第一个if条件的计算结果为true,否则else将不会执行,你将在控制台上打印12个。