这两个陈述是否相等?

时间:2019-03-06 00:52:45

标签: 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;

3 个答案:

答案 0 :(得分:3)

是的,只要x1x2x3的类型相同,它们是等效的。如果类型不同但可以转换为返回类型,则语句1将导致编译错误。

答案 1 :(得分:3)

  

这两个语句是否等效?

具有变体类型:可能没有。

示例:a ? b : c导致bc隐匿为一种常见类型,而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); 语句只有一个级别,则可以使用三元运算符,但是由于这些级别是嵌套的,为了清晰起见,我会坚持使用更明确的一组语句。