首先,在我开始之前,我正在使用VC ++ 2008专业版,在Windows操作系统上运行Intel core2。我也知道这个代码永远不会在运行Windows的core2 / corei7上执行。
我有一个带有2个条件的while循环,看起来像这样: 注意:这是一个非常简化的版本。
while((a != b) && (array[a] < c))
如果第一个条件(a != b)
生成错误,第二个条件是否会被评估?或者循环会在那里终止吗?
我做了一些测试,似乎确实如此。
然而,这是捕获。当第一个条件评估为false时,如果评估第二个条件将生成访问冲突。但是,从我所看到的情况来看,一旦第一个条件被评估为假,程序就不会费心去评估第二个条件并退出循环,从而节省了我。
问题是我无法完全摆脱访问冲突问题,而不会让我非常好的和整洁的代码突然爆炸我。但是,由于小“bug”(我知道它是编译器优化,而不是错误),我似乎能够摆脱它。我也知道这可能不是一个好的编程习惯,但说实话,在我的情况下,如果它有效,我已经领先于游戏。
我的问题是,这个“错误”或编程的弊端是否会在某一天回来并咬我?即使考虑到我测试了本节的地狱,并且只会在这一次使用它吗?
答案 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;
}
}