C 这两种说法相等吗?
报表1C 这两种说法相等吗?,c,if-statement,C,If Statement,报表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; 是的,如果x1、x2和x3的类型都相同,则它
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;
是的,如果
x1
、x2
和x3
的类型都相同,则它们是等效的。如果类型不同但可转换为返回类型,则语句1将导致编译错误。是,它们是等效的
从内部开始,如果:
if(x1>x3){
return x1;
}
else{
return x3;
}
这与:
return (x1 > x3) ? x1 : x3;
让我们调用上面的表达式X
:
return (x1 > x2) ? ((x1 > x3)? x1 :x3) : ((x2 > x3) ? x2 : x3);
现在看一下外部if/else if/else:
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);
如果将其拆分为多行,则会更加清楚:
return (x1 > x2) ? ((x1 > x3)?
x1 :
x3) :
(x2 > x3) ? x2 : x3;
如果只有一个级别的If
语句,我可能会使用三元运算符,但由于这些级别是嵌套的,为了清晰起见,我会使用更明确的语句集
这两种说法相等吗
使用变体类型:可能没有
示例: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));
}
或者可能是两种方法下的编译器错误
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);
}
问题是关于C,不是C++。我认为我有C++搜索:我已经去掉了C++的推荐。如果这些类型是算术,通常的算术转换适用于三元表达式。在C语言中,我想不出任何情况下,x1>x3
是有效的,但是(x1>x3)?x1:x3不是。不同意“语句1将导致编译错误”。已启用模糊C代码模式。两者都比:int max=x1;如果(x2>最大值)最大值=x2;如果(x3>最大)最大=x3;回报最大代码>(其中假定类型int
,但可以是x1
,x2
,x3
-定义了
的类型的(公共?)标量类型)。