6

首先,在开始之前,我使用的是 VC++ 2008 Professional,在 Windows 操作系统上运行 Intel core2。我也知道,除了运行 Windows 的 core2/corei7 之外,该代码永远不会在任何其他设备上执行。

我有一个带有 2 个条件的 while 循环,看起来像这样:注意:这是一个非常简化的版本。

while((a != b) && (array[a] < c))

如果第一个条件(a != b)产生错误,那么第二个条件是否会被评估?或者循环会在那里终止吗?

我做了一些测试,似乎确实如此。

但是,这里有问题。当第一个条件评估为假时,如果第二个条件被评估,则将生成访问冲突。但是,据我所知,一旦第一个条件被评估为假,程序就不会费心评估第二个条件并退出循环,从而拯救了我。

问题是,如果不让我非常漂亮和整洁的代码突然爆发,我就无法完全摆脱访问冲突问题。但是,由于小“错误”(我知道这是编译器优化,而不是错误),我似乎能够摆脱它。我也知道这可能不是一个好的编程习惯,但老实说,在我的情况下,如果它有效,我已经领先了。

我的问题是,这个“错误”或编程弊端有一天会回来咬我吗?即使考虑到我测试了这一部分的地狱并且只会使用它一次?

4

6 回答 6

23

除非第一个条件被评估为真,否则不会评估第二个条件。你可以指望这一点。数百万行代码可以工作,因为这就是 C 和 C++ 进行简短逻辑表达式求值的方式。

您可以使用它并依靠它。如果第一个表达式的计算结果为 false,则第二个表达式甚至不会开始计算。

于 2009-07-10T07:09:30.573 回答
4

这不是错误。C++ 使用短路评估,因此当第一个条件为假时,永远不会评估第二个条件。

于 2009-07-10T07:10:44.173 回答
2

它不会被评估。但是,如果您担心 - 根本 - 您编写的例程会回来咬您,您应该重新评估您正在编写的内容。您已经承认这是一种糟糕的编程习惯。你已经知道这将是一个问题。当满足这些条件时,只需修复它。早上你会不那么讨厌自己。

于 2009-07-10T07:10:21.930 回答
1

该语言保证了这种短路行为,因此您完全不必担心使用它。它也适用于 || - 如果第一个条件为真,则不评估第二个条件。

于 2009-07-10T07:23:19.373 回答
1

依靠短路 C++ 逻辑 AND 和 OR 运算符的短路行为不应被视为不好的做法。它是完全惯用的,通常会导致代码更清晰、更简洁。

例如

std::auto_ptr< SomeObject > data;

短路&&

// Clear expired data, if present
if( data.get() && data->expired )
    data.reset();

在不使用短路的情况下,&&您需要一个额外的级别,if这会导致更冗长的代码。

// Clear expired data, if present
if( data.get() )
{
    if ( data->expired )
        data.reset();
}
于 2009-07-10T07:25:04.100 回答
1

当第一个条件不成立时,不会评估第二个条件。正如您所说,所有 C++ 编译器都遵循这种优化。

如果还是不行,可以在while里面加一个简单的if语句。

while ( a != b ) {
    if ( array[a] < c )
    {
         // your code goes here.
    }
    else
    {
        break;
    }
}
于 2009-07-10T09:12:58.437 回答