if语句的可靠性如何
本文关键字:可靠性 语句 if | 更新日期: 2023-09-27 18:26:00
如果我运行以下代码,
while(true)
{
if(true)
{
Console.WriteLine("True");
}
else
{
Console.WriteLine("False")
}
}
控制台打印"True"的可靠性如何?如果真的会打印"假"吗?为什么?
编辑:我不知道计算机的物理组件是如此完美。
这个问题比投反对票的人想的更有趣。
当然,这个条件逻辑真的很完美。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
语句和所有其他布尔逻辑一样,是完全可靠和确定的。