while循环中的条件顺序
Posted
技术标签:
【中文标题】while循环中的条件顺序【英文标题】:Condition order in while loop 【发布时间】:2010-11-09 15:15:43 【问题描述】:首先,在开始之前,我使用的是 VC++ 2008 Professional,在 Windows 操作系统上运行 Intel core2。我也知道,除了运行 Windows 的 core2/corei7 之外,此代码永远不会在任何其他设备上执行。
我有一个带有 2 个条件的 while 循环,看起来像这样: 注意:这是一个非常简化的版本。
while((a != b) && (array[a] < c))
如果第一个条件(a != b)
生成一个假,那么第二个条件是否也会被评估?或者循环会在那里终止吗?
我做了一些测试,似乎确实如此。
但是,这里有一个问题。当第一个条件评估为假时,如果第二个条件被评估,则将生成访问冲突。但是,据我所见,一旦第一个条件被评估为假,程序就不会费心评估第二个条件并退出循环,从而拯救了我。
问题是我不能完全摆脱访问冲突问题,而不会让我非常漂亮和整洁的代码突然爆发。但是,由于小“错误”(我知道这是编译器优化,而不是错误),我似乎能够摆脱它。我也知道这可能不是一个好的编程习惯,但老实说,在我的情况下,如果它有效,我已经领先了。
我的问题是,这个“错误”或编程不当行为会在某一天再次出现并咬我吗?即使考虑到我测试了这一部分的地狱并且只会使用它一次?
【问题讨论】:
哇,你有很多问题不是吗!你应该加我的信使哈哈 你又来了!我会在 MM 上给你发消息,并给你我的信使。伙计,就像凌晨 3 点一样!你不睡觉吗?你只是喜欢……住在这里吗? (我才起这么晚,因为这是唯一一次其他人都睡着了而不打扰我,这样我就可以完成我的论文了)。 我会定期检查我的几个网站,您的问题总是引起我的兴趣并且位于页面顶部附近。变得有点吓人了。我其实早起 - 2 小时后去健身房。 【参考方案1】:当第一个条件不成立时,不会评估第二个条件。 正如您所说,所有 C++ 编译器都遵循这种优化。
如果还是不行,在while里面加个简单的if语句。
while ( a != b )
if ( array[a] < c )
// your code goes here.
else
break;
【讨论】:
【参考方案2】:不应将依赖 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();
【讨论】:
【参考方案3】:该语言保证了这种短路行为,因此您完全不必担心使用它。它也适用于 || - 如果第一个条件为真,则不评估第二个条件。
【讨论】:
【参考方案4】:这不是错误。 C++ 使用短路求值,所以当第一个条件为假时,第二个条件永远不会被求值。
【讨论】:
【参考方案5】:它不会被评估。但是,如果您担心 - 根本 - 您编写的例程会回来咬您,您应该重新评估您正在编写的内容。您已经承认这是一种糟糕的编程习惯。你已经知道这将是一个问题。当满足这些条件时,只需修复它。早上你会不那么讨厌自己。
【讨论】:
我明白了,但是我写的 13 行漂亮而整洁的代码依赖于它才能正常工作......如果我修复它,我会失去很多速度和效率。当我的意思是很多时,我的意思是代码执行速度会慢 2-3 倍。 别担心。我们也根据短期评估编写代码。如果循环条件在开始时为假,您不会期望 while 循环开始,是吗?这里也是一样。 我很感兴趣,你为什么同意这是一种糟糕的编程习惯?【参考方案6】:除非第一个条件被评估为真,否则不会评估第二个条件。你可以指望这一点。数百万行代码可以工作,因为这就是 C 和 C++ 进行简短逻辑表达式求值的方式。
您可以使用它并依靠它。如果第一个表达式的计算结果为 false,则第二个表达式甚至不会开始计算。
【讨论】:
但是,如果在导致第一个条件返回 false 的状态下进行评估,即使第二个条件可能导致程序崩溃,这是否可以使用? 是的,任何符合标准的 C++ 实现都会保证这一点。 @Faken - 是的,没关系。别担心! 如果有帮助,Faken,请这样看:如果 LHS 为假,C++ 标准禁止任何实现评估 RHS。所以不仅仅是编译器“不”评估它。在 RFC 术语中,它不能评估它。 这确实不是bug,而是功能!以上是关于while循环中的条件顺序的主要内容,如果未能解决你的问题,请参考以下文章