C 这两种说法相等吗?

C 这两种说法相等吗?,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的类型都相同,则它

报表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
的类型都相同,则它们是等效的。如果类型不同但可转换为返回类型,则语句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
-定义了
的类型的(公共?)标量类型)。