首页 > 解决方案 > 这两个陈述是等价的吗?

问题描述

声明 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;

标签: cif-statement

解决方案


这两个陈述是等价的吗?

使用变体类型:可能没有。

示例: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);
}

推荐阅读