短路是编译器的优化步骤之一,在此步骤中,避免对表达式求值时不必要的计算。从左到右评估表达式。在某些情况下,仅通过评估表达式的某些部分就可以确定表达式的值,则该方法适用。
C++中的短路
在C++中,在评估’&&’(AND)和’||’(OR)逻辑运算符时会发生短路。在评估’&&’运算符,如果’&&’的左侧为false,则无论’&&’右侧的值如何,表达式始终会产生false,因此请检查’&&’的右侧’ 没有意义。因此,在这种情况下,编译器避免了对右侧的评估。类似地,在逻辑OR的情况下,“ ||”如果左侧的操作符为“ true”,则表达式的结果将始终为true,而与右侧的值无关。
使用AND(&&)和OR(||)逻辑运算符进行短路。
C++
#include
using namespace std;
int main()
{
// Short circuiting
// logical "||"(OR)
int a = 1, b = 1, c = 1;
// a and b are equal
if (a == b || c++) {
cout << "Value of 'c' will"
<< " not increment due"
<< " to short-circuit"
<< endl;
}
else {
cout << "Value of 'c' "
<< " is incremented as there"
<< " is no short-circuit"
<< endl;
}
// Short circuiting
// logical "&&"(OR)
if (a == b && c++) {
cout << "Value of 'c' will"
<< " increment as there"
<< " is no short circuit"
<< endl;
}
else {
cout << "Value of 'c' will"
<< " not increment due to short circuit"
<< endl;
}
}
Value of 'c' will not increment due to short-circuit
Value of 'c' will increment as there is no short circuit
Linux中的短路
在Linux中,在评估’&&’和’||’时会发生短路像C++一样的运算符。
逻辑AND(&&)短路:
回声“将不会打印此输出”
别的
回声“将输出此输出”
“实际上是由于短路”
科幻
如果[[“ $ 1” -lt 5]] && [[“ $ 1” -lt 10]];然后
回声“将输出此输出”
“因为不会短路”
别的
回声“将输出此输出”
“实际上是由于短路”
科幻
输出:
逻辑OR(||)短路:
回声“将输出此输出”
“实际上是由于短路”
别的
回声“将输出此输出”
“因为不会短路”
科幻
如果[[“ $ 1” -gt 5]] || [[“ $ 1” -lt 10]];然后
回声“将输出此输出”
“因为不会短路”
别的
回声“将输出此输出”
“实际上是由于短路”
科幻
输出:
Note: ‘&&’ operator is often used as a replacement to ‘if’ statement.
例如,要检查文件的存在,可以使用以下两种方法之一:
-
if [[ -e "$filename" ]]; then echo "exists" fi
-
[[ -e "$filename" ]] && echo "exists"
在这种情况下,bash首先执行&&(and)左侧的表达式。如果该表达式的返回值非零(即失败),则无需评估&&的右侧,因为已知总体退出状态为非零,因为双方都必须返回成功逻辑并返回成功的指示器。