Logic 这里有逻辑漏洞吗?

Logic 这里有逻辑漏洞吗?,logic,computer-science,boolean-logic,Logic,Computer Science,Boolean Logic,我需要执行这样一段代码 if(condition 1) { set variable to false } else if (condition 2) { set variable to false } else { set variable to true } 这和我的一样吗 if(!condition 1) { if(!condition2) { variable = true } } 在任何情况下,这两者的结果会有所不同吗?这有

我需要执行这样一段代码

if(condition 1)
{
    set variable to false
}
else if (condition 2)
{
    set variable to false
} else {
    set variable to true
}
这和我的一样吗

 if(!condition 1)
 {
   if(!condition2)
   {
     variable = true
   }
 }

在任何情况下,这两者的结果会有所不同吗?这有系统的证据吗

第二个代码段几乎等同于第一个代码段-如果您可以假设
变量
初始化为
false
,除非另外设置,这可能在某些编程语言中工作,但可能是个坏主意,您最好在调用此代码段之前将其显式初始化为
false

顺便注意,使用逻辑运算符可以大大缩短整个表达式:

variable = !(condition1) && !(condition2);
或者可以说更优雅:

variable = !(condition1 || condition2);
你的问题

在任何情况下,这两者的结果会有所不同吗

是相当广泛的,我可以想到至少四种情况下,两个片段的结果可能不同。正如其他人所指出的,这是假设您的第二个示例前面有以下初始化:

variable = false
如果没有上述初始化步骤,许多编程语言将创建
变量
,而不会自动初始化它,这意味着它的值是不确定的

在介绍了这四个案例之后,我将在最后证明两个代码段中的逻辑是相同的

案例1:评估病情时的副作用 第一种情况是,如果编程语言允许在评估条件时出现“副作用”,则这些情况可能会有所不同

例如,在C语言中,条件可能是赋值语句的结果,赋值语句可以更改被测试变量的状态

考虑下面的例子。如果我们在两个代码段中将
变量
初始化为
,并让条件1为
((变量=!变量==真)
,条件2为
((变量=!变量==假)
(其副作用是更改
变量
的值),则在以下C代码中:

bool variable1 = false;
if (((variable1 = !variable1) == true)) {
    variable1 = false;
}
else if (((variable1 = !variable1) == false)) {
    variable1 = false;
}
else {
    variable1 = true;
}

bool variable2 = false;
if (!((variable2 = !variable2) == true)) {
    if (!((variable2 = !variable2) == false)) {
        variable2 = true;
    }
}
结果将是
variable1==false
variable2==true
,这说明了结果不同的情况

案例2:重载赋值运算符

在C++语言中,赋值运算符(<代码>=/COD>)可以重载,这意味着它的整个意义可以改变为不同于它出现的不同。因此,可以定义赋值运算符,其中

variable = false;
有时会导致
变量
被分配值
,但在某些情况下会导致
变量
实际被分配值
。这是一个奇怪的例子,但你的问题是

在任何情况下,这两者的结果会有所不同吗

所以这里我假设“任何情况”都允许基本假设(比如
variable=false
实际上意味着
variable=false
)可以被搁置。不难想象这样一种场景:一个赋值操作符可以设计成使这两种情况产生不同的结果。有人可能会说,我在这里思考得太远了,但是在现实世界中,我们有一些语言,比如C++,有时确实会有不同于预期的行为。 案例3:条件对时间敏感 可以想象,一个给定的优化编译器可能会将两个代码段都识别为等价的,并且可能会将它们编译成相同的机器代码。大多数编译器很可能会为这两个代码段生成不同的机器代码。如果机器代码不同,则两个代码段之间的执行时间可能不同。如果条件2测试计时器的值,则计时器在第一个代码段中测试时的值可能与在第二个代码段中测试时的值不同,这可能会产生不同的决定,从而在
变量中产生不同的结果

情况4:多个线程 在采用抢占式多任务处理的程序中,有时程序员会忘记他们不再在封闭系统中工作。如果任务是一个线程,并且构成条件1或条件2的
变量和/或元素在两个异步线程中都是可写的,则任何一个代码段都可能被另一个线程中断,从而更改正在评估或设置的变量的状态,从而导致不可预知的结果

案例五:不耍花招 如果我们假设我们谈论的是一个封闭的静态系统,没有像上面那样的意外,并且您真正想要的只是一个简单的证明,证明这两个片段在逻辑上是等价的,那么创建一个考虑所有可能性的真值表:

         Inputs               Output
Condition 1  Condition 2    "variable"
-----------  -----------    ----------
   False        False          True
   False        True           False
   True         False          False
   True         True           False
如果您通过两个代码段运行这些输入,我相信您会发现这两个代码段将产生上表输出列中显示的相同结果。这将作为一个系统的证据,证明两者是相同的


此表和您的两个代码片段恰好表示
函数的行为。

变量=!(条件1)和&!(条件2)
这与在第二个变量中从未将变量设置为false不同。如果可以假设变量已经为false,那么是的,它们是相同的。证明必须与嵌套分支与逻辑运算符的等价性有关。