声明1
return (x1 > x2) ? ((x1 > x3) ? x1: x3): ((x2 > x3) ? x2: x3);
声明2
if(x1>x2){
if(x1>x3){
return x1;
}
else{
return x3;
}
}
else if(x2>x3){
return x2;
}
else return x3;
答案 0 :(得分:3)
是的,只要x1
,x2
和x3
的类型相同,它们是等效的。如果类型不同但可以转换为返回类型,则语句1将导致编译错误。
答案 1 :(得分:3)
这两个语句是否等效?
具有变体类型:可能没有。
示例:a ? b : c
导致b
和c
隐匿为一种常见类型,而if then else
并非如此。
#include<stdio.h>
double foo(int x1, float x2, int x3) {
// Inexact conversions to float vv vv
return (x1 > x2) ? ((x1 > x3) ? x1 : x3) : ((x2 > x3) ? x2 : x3);
}
double bar(int x1, float x2, int x3) {
if (x1 > x2) {
if (x1 > x3) {
return x1;
} else {
return x3;
}
} else if (x2 > x3) {
return x2;
} else
return x3;
}
int main(void) {
printf("%f\n", foo(INT_MAX, 1.0f, 0));
printf("%f\n", bar(INT_MAX, 1.0f, 0));
}
输出
2147483648.000000
2147483647.000000
或者两种方法都可能出现编译器错误。
double foo2(int x1, float x2, int *x3) {
// error: invalid operands to binary > (have 'float' and 'int *')
return (x1 > x2) ? ((x1 > x3) ? x1 : x3) : ((x2 > x3) ? x2 : x3);
}
答案 2 :(得分:1)
是的,它们是等效的。
从内部False
开始:
False
这与:
if
让我们调用上面的表达式if(x1>x3){
return x1;
}
else{
return x3;
}
:
现在查看外部if / else if / else:
return (x1 > x3) ? x1 : x3;
它变成:
X
替换为if(x1>x2){
return X;
}
else if(x2>x3){
return x2;
}
else return x3;
:
return (x1>x2) ? X : ((x2>x3) ? x2 : x3);
如果将其分成多行,则可能会更清楚:
X
如果return (x1 > x2) ? ((x1 > x3)? x1 :x3) : ((x2 > x3) ? x2 : x3);
语句只有一个级别,则可以使用三元运算符,但是由于这些级别是嵌套的,为了清晰起见,我会坚持使用更明确的一组语句。