if语句的可靠性如何?

时间:2014-10-09 10:24:34

标签: c# reliability

如果我运行以下代码,

while(true)
{
    if(true)
    {
        Console.WriteLine("True");
    }
    else
    {
        Console.WriteLine("False")
    }
}

控制台打印“True”的可靠性如何? 是否会打印“假”? 为什么?

编辑:我不知道计算机的物理组件是如此完美。

5 个答案:

答案 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可能会出错,硬盘可能会错误地存储程序本身,操作系统可能无法保护您的进程内存免受其他一些错误的进程等。所有这些都是极不可能的。

相关问题:https://softwareengineering.stackexchange.com/questions/34120/how-often-do-cpus-make-calculation-errors

答案 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语句与所有其他布尔逻辑一样,完全可靠且具有确定性。