如果我运行以下代码,
while(true)
{
if(true)
{
Console.WriteLine("True");
}
else
{
Console.WriteLine("False")
}
}
控制台打印“True”的可靠性如何? 是否会打印“假”? 为什么?
编辑:我不知道计算机的物理组件是如此完美。
答案 0 :(得分:1)
这个问题比人们认为的更为有趣。
当然,条件逻辑非常完美。 Visual Studio会生成警告:Unreachable code detected
,因此永远不会执行else
分支。
即使出现硬件故障,计算机/操作系统/程序本身也比第二次早午餐更容易崩溃。
但并不意味着不会打印“False”。 dotnet中的字符串文字通常为interned。 看看这个黑客:
static unsafe void Main(string[] args)
{
// "True" is interned now
string s = "True";
// unsafe access to the interned string
fixed (char* h = s)
{
// We have to change the length of the string.
// The length is stored as integer value right before the first char
((int*)h)[-1] = 5;
// Next operations change content of interned string
h[0] = 'F';
h[1] = 'a';
h[2] = 'l';
h[3] = 's';
// But next one is dangerous - they can damage memory contents
h[4] = 'e';
}
// the most reliable code ever:)
while (true)
{
if (true)
{
Console.WriteLine("True");
}
else
{
Console.WriteLine("False");
}
}
}
else
分支未执行,可以通过调试器确保,因此条件逻辑仍然是一致的。但是,即使通过System.Console
方法,程序也会打印“False”。
这个技巧需要在编译器选项中启用不安全的上下文,而且会损坏进程的内存。
答案 1 :(得分:1)
我说得足够可靠,你不必担心,但不完美。
例如,说明为真的位有可能被翻转为假(宇宙射线干扰,有缺陷的内存,运气不好......),然后您的程序将写入False。这些类型的错误称为soft errors。
IBM在20世纪90年代的研究表明,计算机通常每月每256兆字节RAM会出现一次宇宙射线引起的错误。[1]
请注意,大多数现代编译器会因优化而删除if分支,从而进一步减少了机会:)。
当然,记忆不是唯一可能出错的事情。在评估比较指令时,CPU可能会出错,硬盘可能会错误地存储程序本身,操作系统可能无法保护您的进程内存免受其他一些错误的进程等。所有这些都是极不可能的。
答案 2 :(得分:0)
它将始终打印" True"因为这是它的设计方式。
答案 3 :(得分:0)
如果它没有显示真实,我认为整个计算会突然变得有缺陷。有一个计算领域,这可能适用于"模糊逻辑"在谷歌。
答案 4 :(得分:0)
它打印的唯一方式" False"如果你做了这样的事情:
using System;
namespace Demo
{
public static class Console
{
public static void WriteLine(string unused)
{
System.Console.WriteLine("False");
}
}
public static class Program
{
private static void Main(string[] args)
{
if(true)
{
Console.WriteLine("True");
}
else
{
Console.WriteLine("False");
}
}
}
}
(是的,这确实打印了#34; False" - 但显然我被骗了。;))
但除了作弊之外,if
语句与所有其他布尔逻辑一样,完全可靠且具有确定性。