while循环中的条件顺序

时间:2009-07-10 07:06:19

标签: c++ loops conditional-statements

首先,在我开始之前,我正在使用VC ++ 2008专业版,在Windows操作系统上运行Intel core2。我也知道这个代码永远不会在运行Windows的core2 / corei7上执行。

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

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

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

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

然而,这是捕获。当第一个条件评估为false时,如果评估第二个条件将生成访问冲突。但是,从我所看到的情况来看,一旦第一个条件被评估为假,程序就不会费心去评估第二个条件并退出循环,从而节省了我。

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

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

6 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

不会评估。但是,如果你担心 - 所有 - 你编写的例程会回来咬你,你应该重新评估你在写什么。你已经承认这是一个糟糕的编程习惯。你已经知道它会成为一个问题。满足这些条件时,只需解决问题。你早上会少恨自己。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

E.g。

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();
}

答案 5 :(得分:1)

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

如果仍然无法使用它,请在while中添加一个简单的if语句。

while ( a != b ) {
    if ( array[a] < c )
    {
         // your code goes here.
    }
    else
    {
        break;
    }
}