if语句的可靠性如何

本文关键字:可靠性 语句 if | 更新日期: 2023-09-27 18:26:00

如果我运行以下代码,

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

控制台打印"True"的可靠性如何?如果真的会打印"假"吗?为什么?

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

if语句的可靠性如何

这个问题比投反对票的人想的更有趣。

当然,这个条件逻辑真的很完美。Visual studio生成一个警告:Unreachable code detected,因此永远不会执行else分支。

即使在硬件故障的情况下,计算机/操作系统/程序本身也比第二次执行的早午餐更有可能崩溃。

这并不意味着不会打印"False"。dotnet中的字符串文字通常是内部的。看看这个黑客:

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"。

这个技巧要求在编译器选项中启用不安全的上下文,而且,它可能会损坏进程的内存。

我认为它足够可靠,不必担心,但并不完美。

例如,有一个微小的机会,说真的比特被翻转为假(宇宙射线干扰,错误的ram,坏运气…),然后你的程序会写假。这些类型的错误称为软错误。

IBM在20世纪90年代的研究表明,计算机每月每256兆字节的RAM通常会经历一次宇宙射线引起的错误。[1]

请注意,由于优化,大多数现代编译器都会删除if分支,从而进一步减少机会:)。

当然,记忆并不是唯一可能出错的东西。CPU在评估比较指令时可能会出错,硬盘可能会错误地存储程序本身,操作系统可能无法保护进程的内存免受其他故障进程的影响,等等。所有这些都是极不可能的。

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

它将始终打印"True",因为这是它的设计方式。

如果它没有显示为true,我认为整个计算会突然变得有缺陷。在计算领域,这可能适用于谷歌中的"模糊逻辑"。

它能打印"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");
            }        
        }
    }
}

(是的,这确实打印了"假"——但很明显我作弊了。)

但除了欺骗之外,if语句和所有其他布尔逻辑一样,是完全可靠和确定的。