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
    a
    为false时不进行计算
  • 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
时。