C++ 关于条件语句如何执行的简单查询C++;
简单的是或否问题: 我有一段代码,就像C++ 关于条件语句如何执行的简单查询C++;,c++,C++,简单的是或否问题: 我有一段代码,就像 while (_attributeChars.find_first_of(*it++) != std::string::npos) 我想知道当属性出现时,it是否仍然会增加std::string::npos为false。也就是说,即使在最后一次计算while循环时它也会增加?是,it在计算该条件时总是会增加,因为每次都必须计算表达式it++。如果计算具有副作用的表达式,则会观察到这些副作用 在某些情况下,它是不可能的,但这只是在使用短路布尔运算符时发生
while (_attributeChars.find_first_of(*it++) != std::string::npos)
我想知道当属性出现时,
it
是否仍然会增加std::string::npos
为false
。也就是说,即使在最后一次计算while
循环时它也会增加?是,it
在计算该条件时总是会增加,因为每次都必须计算表达式it++
。如果计算具有副作用的表达式,则会观察到这些副作用
在某些情况下,它是不可能的,但这只是在使用短路布尔运算符时发生的,您在这里没有使用。例如:
while (something() && it++)
在这种情况下,如果something()
的计算结果为false,则它不会递增,因为如果正确的操作数与结果无关,&&
运算符会短路。|
和:
操作员也短路
:a和&b
在b
为false时不进行计算a
:a | | b
在b
为真时不计算a
:如果a?b:c
为真,则只计算a
,否则只计算b
c
如果未计算表达式,则不会执行它的任何副作用(如递增/递减或函数调用)。要让程序知道它是应该继续还是停止循环,它必须计算内部表达式,这意味着在这种情况下,
*它+++
将始终执行
另一件与您的问题相关的事情是++x
和x++
之间的区别。第一种形式返回x的新值,而第二种形式返回旧值
您可以在此处了解更多信息:这可以通过使用调试器轻松解决……除非它们是用户定义类型的重载布尔运算符……:-/我看不出短路与这个问题有多大关系。@Alex我正在展示一种情况,在这种情况下,表达式中不会出现副作用,作为这种特殊情况的反例。有时知道副作用何时不会发生将有助于说明为什么会发生——在这种情况下,因为没有任何操作人员会短路。@TonyD我不明白。在
a和&b
中,两者都是用户定义的类型,带有运算符bool()
,如果a
转换为false,b
仍不计算@cdhowie我想Tony D的意思是当重载和&operator
时。