首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这里有没有逻辑漏洞?

这里有没有逻辑漏洞?
EN

Stack Overflow用户
提问于 2016-01-12 01:36:33
回答 2查看 250关注 0票数 3

我需要执行一段代码,代码如下

代码语言:javascript
复制
if(condition 1)
{
    set variable to false
}
else if (condition 2)
{
    set variable to false
} else {
    set variable to true
}

这是不是和

代码语言:javascript
复制
 if(!condition 1)
 {
   if(!condition2)
   {
     variable = true
   }
 }

这两种结果在任何情况下都会不同吗?对此有系统的证据吗?

EN

回答 2

Stack Overflow用户

发布于 2016-01-12 01:44:49

第二个代码片段几乎等同于第一个代码片段-以防您可以假设除非另外设置,否则variable被初始化为false,这在某些编程语言中可能有效,但这可能不是一个好主意,您最好在调用此代码片段之前显式地将其初始化为false

请注意,顺便说一句,整个表达式可以通过使用逻辑运算符来大大缩短:

代码语言:javascript
复制
variable = !(condition1) && !(condition2);

或者可以说是更优雅:

代码语言:javascript
复制
variable = !(condition1 || condition2);
票数 4
EN

Stack Overflow用户

发布于 2016-01-17 13:26:31

你的问题

这两种结果在任何情况下都可能不同吗?

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

代码语言:javascript
复制
variable = false

如果没有上述初始化步骤,许多编程语言将在不自动初始化variable的情况下创建它,这意味着它的值是不确定的。

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

案例1:评估条件时的副作用

它们可能不同的第一种情况是,编程语言在评估条件时是否允许发生“副作用”。

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

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

代码语言:javascript
复制
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 == falsevariable2 == true,这说明了结果不同的情况。

案例2:重载赋值运算符

在C++语言中,赋值运算符(=)可以重载,这意味着可以将其整个含义更改为与其外观不同的内容。因此可以定义一个赋值运算符,其中

代码语言:javascript
复制
variable = false;

有时会导致variable被赋值为false,但在某些情况下会导致variable实际上被赋值为true。这是一个奇怪的例子,但您的问题是

这两种结果在任何情况下都可能不同吗?

因此,在这里,我假设“任何情况”都允许基本假设(例如variable = false实际上意味着variable = false)可以被搁置。不难想象这样一种场景:可以设计一个赋值运算符,使这两种情况产生不同的结果。有人可能会说,我在这里想得太离谱了,但在现实世界中,我们有像C++这样的语言,它们的行为有时确实与人们预期的不同。

情况3:条件是时间敏感的

可以想象,给定的优化编译器可能会将您的两个代码片段识别为等价的,并且实际上可能会将它们编译成相同的机器码。大多数编译器很可能会为这两个代码片段生成不同的机器码。如果机器代码不同,则两个代码片段的执行时间可能不同。如果条件2测试计时器的值,那么在测试第一个片段时,计时器的值可能与第二个片段中的值不同,这可能会产生不同的决定,从而在variable中产生不同的结果。

案例4:多个线程

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

案例5:没有花招

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

代码语言:javascript
复制
         Inputs               Output
Condition 1  Condition 2    "variable"
-----------  -----------    ----------
   False        False          True
   False        True           False
   True         False          False
   True         True           False

如果您在两个代码片段中运行这些输入,我相信您会发现这两个代码片段产生的结果与上表中的输出列中显示的结果相同。这将作为一个系统的证据,证明两者是相同的。

这个表和您的两个代码片段恰好代表了NOR函数的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34727701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档