Оба эти утверждения эквивалентны? - PullRequest
2 голосов
/ 06 марта 2019

выписка 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 ]

3 голосов
/ 06 марта 2019

Оба эти утверждения эквивалентны?

С типами вариантов: возможно, нет.

Пример: 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);
}
3 голосов
/ 06 марта 2019

Да, они эквивалентны при условии, что типы x1, x2 и x3 все одинаковые.Если типы отличаются, но могут быть преобразованы в возвращаемый тип, то оператор 1 приведет к ошибке компиляции.

1 голос
/ 06 марта 2019

Да, они эквивалентны.

Начиная с внутреннего if:

if(x1>x3){
    return x1;
}
else{
    return x3;
}

Это то же самое, что и

return (x1 > x3) ? x1 : x3;

Давайте назовем вышеприведенное выражение X:

Теперь посмотрим на внешний 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 операторов, я мог бы пойти с троичным оператором, но поскольку уровни являются вложенными, я бы придерживался более явного набора операторов для ясности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...