在布尔表达式中利用短路:
int max(int a, int b, int c){ int m = a; (m < b) && (m = b); //these are not conditional statements. (m < c) && (m = c); //these are just boolean expressions. return m;}说明:
在布尔
AND运算(例如)中
x && y, 当且仅当
x为true时 ,才 评估y
。如果
x为false,
y则不进行评估,因为整个表达式为false,即使不进行评估也可以得出结论
y。当可以推导布尔表达式的值而无需评估其中的所有操作数时,这称为短路。
将此原理应用于上述代码。最初
m是
a。现在,如果
(m < b)为true,则意味着
b大于
m(实际上是
a),因此第二个子表达式
(m= b)被求值并将
m其设置为
b。但是
(m <b),如果为false,则将不评估第二个子表达式
m并将保留
a(大于
b)。以类似的方式,计算第二个表达式(在下一行)。
总之,你可以阅读表达
(m < x) && (m = x)如下:设置
m于
x当且仅当
m小于
x即
(m <x)是如此。希望这可以帮助您理解代码。
测试代码:
int main() { printf("%dn", max(1,2,3)); printf("%dn", max(2,3,1)); printf("%dn", max(3,1,2)); return 0;}输出:
333
请注意
maxGives警告的实现,因为未使用评估表达式:
prog.c:6:警告:未使用计算值
prog.c:7:警告:未使用计算值
为避免这些(无害)警告,您可以实现
max为:
int max(int a, int b, int c){ int m = a; (void)((m < b) && (m = b)); //these are not conditional statements. (void)((m < c) && (m = c)); //these are just boolean expressions. return m;}诀窍在于,现在我们将布尔表达式强制转换为
void,这会导致警告的抑制



