我必须找到用户提供的最多三个号码,但有一些限制。不允许使用任何条件语句。我尝试使用如下三元运算符。
max=(a>b?a:b)>c?(a>b?a:b):c
但同样其仅限于使用三元运算符。现在我不知道该怎么做?
在布尔表达式中利用短路:
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。当可以推导布尔表达式的值而无需评估其中的所有操作数时,这称为短路。
AND
x && y
x
y
将此原理应用于上述代码。最初m是a。现在,如果 (m < b)为true,则意味着b大于m(实际上是a),因此第二个子表达式 (m = b)被求值并将m其设置为b。但是(m < b),如果为false,则将不评估第二个子表达式m并将保留a(大于b)。以类似的方式,计算第二个表达式(在下一行)。
m
a
(m < b)
b
(m = b)
总之,你可以阅读表达(m < x) && (m = x)如下:设置m于x 当且仅当 m小于x即(m < x)是如此。希望这可以帮助您理解代码。
(m < x) && (m = x)
(m < x)
测试代码:
int main() { printf("%d\n", max(1,2,3)); printf("%d\n", max(2,3,1)); printf("%d\n", max(3,1,2)); return 0; }
输出:
3 3 3
请注意maxGives警告的实现,因为未使用评估表达式:
max
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,这会导致警告的抑制
void