C# Console.WriteLine语句中的错误在哪里?
如果运行以下代码,将获得输出: 答案是:C# Console.WriteLine语句中的错误在哪里?,c#,.net,operator-precedence,C#,.net,Operator Precedence,如果运行以下代码,将获得输出: 答案是: 被评估为 Console.WriteLine(("The answer is : " + element.InnerHtml != null) ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug? 您的答案是:“+element.InnerHtml优先于!=null 重写为: Console.WriteLine("
被评估为
Console.WriteLine(("The answer is : " + element.InnerHtml != null) ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?
您的答案是:“+element.InnerHtml
优先于!=null
重写为:
Console.WriteLine("The answer is: " + (element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName)); // bug?
(添加括号)这是一个优先级问题。您的声明:
"The answer is: " + element.InnerHtml !=null ? element.InnerHtml : ...
应评估为:
"The answer is: " + (element.InnerHtml !=null ? element.InnerHtml : ...)
<------------------- this first ------------------->
("The answer is: " + element.InnerHtml) !=null ? element.InnerHtml : ...
<------------- this first ------------>
答案是:“+(element.InnerHtml!=null?element.InnerHtml:…)
但实际上评估为:
"The answer is: " + (element.InnerHtml !=null ? element.InnerHtml : ...)
<------------------- this first ------------------->
("The answer is: " + element.InnerHtml) !=null ? element.InnerHtml : ...
<------------- this first ------------>
(“答案是:”+element.InnerHtml)!=null?element.InnerHtml:。。。
最后一个表达式将始终为true,因为“string”+anything!=null
,所以您总是只得到元素。InnerHtml
(
)
在第一次测试中没有问题的原因是,您单独计算val
,因此手动控制优先级
顺便说一句,我喜欢人们似乎认为他们在被数不清的其他人使用的软件中发现了一个bug,而不是考虑他们可能做错了什么的一点点可能性:——)
虽然说实话,我在很多人使用的一款产品(如果我没记错的话,是Microsoft COBOL编译器)中发现了bug,但那是由于签名/未签名的问题,我有一台最早的机器,内存超过512K(其中启动代码进行了检查,以确保您有足够的内存,并将640K视为负数)
尽管如此,四分之一世纪中发现的一个bug还是很低的,所以你不应该认为软件马上就出了问题。我的第一个想法总是不知怎么地塞住了(我通常是对的,这让我很懊恼)。这两个writeline编写不同结果的原因是你的逻辑中有一个微妙的bug。 (如其他地方所述,优先级规则与您期望的不同) 该行:
string val = element.InnerHtml != null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName;
Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?
计算element.InnerHtml是否与null不同,其中作为行:
Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?
计算“答案是:”+element.InnerHtml是否与null不同(它永远不会是null),因此结果将始终是element.InnerHtml(并且文本“答案是”被视为布尔表达式的一部分,因此不会打印),因为还没有人回答
??
:
Console.WriteLine("The answer is: " + ( element.InnerHtml ??
element.InnerText ?? element.TagName ) );
它需要与
?:
方法相同的一对额外的()
。为了可读性,我将重新编写那些嵌套的?:操作,或者至少将它们拆分为单独的行。@Jason:重写为element.InnerHtml??element.InnerText??element.TagName将是niceConsole.WriteLine(“答案是:{0}”“,element.InnerHtml!=null?element.InnerHtml:element.InnerText!=null?element.InnerText:element.TagName)杰森我已经论证过这一点,但正如我在下面说的,这是别人的代码,那是他的代码preference@Hans,Console.WriteLine使用string.format和iformattachable我不敢相信我是第一个发现这一可怕错误的人。这应该在beta版中发现。Microsoft就是这样的傻瓜……哦,没关系。:)