If 语句中的 AND(&&) 是否按照我键入的顺序进行检查?
Does AND(&&) inside an If-Statement get checked in the order I type it?
假设我有这个代码:
if(number_a==1 && number_b==2) {
doStuff();
}
我的代码 运行 会更快吗,如果我把它分成:
if(number_a==1){
if(number_b==2){
doStuff();
}
}
或者计算机 运行 按照我给它的确切顺序执行代码,首先检查 a,如果 a 不是 [=18] 则立即继续=]1?
或者计算机是否有可能首先检查 b,或者同时检查两者(即使 a 不是 1)?
对于 C,这是明确定义的:首先评估 number_a == 1
,仅当第一个条件为真时才评估 number_b == 2
(这称为短路,如果其中之一很重要条件有评估的副作用)。
Cppreference.com 通过更正式的重述证实了这一点:
The logical AND expression has the form lhs && rhs
...
There is a sequence point after the evaluation of lhs. If the result of lhs compares equal to zero, then rhs is not evaluated at all (so-called short-circuit evaluation)
也就是说,您不必担心这个级别的优化问题,而应该相信您的编译器。由于流水线和其他低级位等微架构效应,这两种计算之间的差异是微观的,甚至可能与您的预期相反。
相反,专注于编写干净、简洁和可读的代码,同时编写在其设计中高效的算法。如果 绝对 必要,则可以执行微优化,作为后续步骤。
假设我有这个代码:
if(number_a==1 && number_b==2) {
doStuff();
}
我的代码 运行 会更快吗,如果我把它分成:
if(number_a==1){
if(number_b==2){
doStuff();
}
}
或者计算机 运行 按照我给它的确切顺序执行代码,首先检查 a,如果 a 不是 [=18] 则立即继续=]1? 或者计算机是否有可能首先检查 b,或者同时检查两者(即使 a 不是 1)?
对于 C,这是明确定义的:首先评估 number_a == 1
,仅当第一个条件为真时才评估 number_b == 2
(这称为短路,如果其中之一很重要条件有评估的副作用)。
Cppreference.com 通过更正式的重述证实了这一点:
The logical AND expression has the form
lhs && rhs
...
There is a sequence point after the evaluation of lhs. If the result of lhs compares equal to zero, then rhs is not evaluated at all (so-called short-circuit evaluation)
也就是说,您不必担心这个级别的优化问题,而应该相信您的编译器。由于流水线和其他低级位等微架构效应,这两种计算之间的差异是微观的,甚至可能与您的预期相反。
相反,专注于编写干净、简洁和可读的代码,同时编写在其设计中高效的算法。如果 绝对 必要,则可以执行微优化,作为后续步骤。