C++ if语句中&&表达式运行结果不符合预期原因问询
结论
这不属于C++未定义行为,是你对两段代码的执行逻辑理解存在偏差,问题核心出在&&运算符的短路特性上。
原因拆解
C++标准明确规定:内置&&运算符从左到右求值,且左操作数求值结果为false时,右操作数会完全跳过不执行,这就是短路规则。
第一段代码无输出的原因
我们按顺序走一遍你第一段示例的执行流程:
std::set<int> set{3, 4, 6}; bool repl = false; for (size_t i = 3; i < 7; ++i) { if (repl && (repl = set.count(i))) { std::cout << "strangeif" << std::endl; } }
- 初始
repl = false,第一次循环i=3时,&&左操作数repl为假,直接短路,右操作数repl = set.count(i)根本不会执行,repl保持false,if条件不满足。 - 后续所有循环的初始
repl都一直是false,每次都会触发短路,赋值操作永远执行不到,repl永远不会被更新为true,自然不会有任何输出。
两段代码不等价的核心差异
你写的第二段代码中,newRepl = set.count(i)是循环内独立的语句,每次循环必然执行,和repl的初始值完全无关:
std::set<int> set{3, 4, 6}; bool repl = false; for (size_t i = 3; i < 7; ++i) { bool newRepl = set.count(i); // 每次循环必执行 if (repl && newRepl) { std::cout << "strangeif" << std::endl; } repl = newRepl; // 每次循环必更新repl }
执行流程为:
i=3时,newRepl = true,if判断false && true不成立,随后repl更新为truei=4时,newRepl = true,if判断true && true成立,输出strangeif,随后repl保持true- 后续循环按规则执行,符合你看到的输出结果。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

