Подтвердить что ты не робот

Оператор вопросительного знака в выражениях

K & R Second Edition (стр. 71) - я, должно быть, пропустил объяснение:

sign = (s[i] == '-') ? -1 : 1;

Контекст это функция, которая преобразует строку в double. Эта часть, в частности, возникает после того, как функция пропускает пробел. Я полагаю, что проверяет положительное или отрицательное значение и сохраняет его как -1 или +1 для преобразования знака в конце функции... return sign * val /power;

Я хотел бы сделать лучше, чем сделать вывод... Я особенно не знаю, что здесь делают ? и : 1 (или где угодно, если на то пошло).

Это похоже на абстрактную инструкцию if. Где ? проверяет правду, а : - else... это так? Оно ограничено if/else?

Я новичок, и я раньше не встречал синтаксис этого выражения, поэтому мне интересно, есть ли какая-то конкретная причина, по-видимому, его часто заменяют формальным if/else - кроме того, возможно, читабельность?

4b9b3361

Ответ 1

Это похоже на абстрактное утверждение if.

Это правильно. Это называется "тернарным условным оператором".

Нормальный if работает с операторами, а условный оператор работает с выражениями.


Мне интересно, есть ли какая-то конкретная причина, по-видимому, часто заменяется формальным if/else - кроме того, возможно, читабельность?

Есть случаи, когда разветвление на операторах недостаточно, и вам нужно работать над уровнем выражения.

Например, рассмотрим инициализацию:

const int foo = bar ? 5 : 3;

Это не может быть записано с использованием обычного if/else.


В любом случае, люди, которые говорят, что это эквивалентно if/else, неточны. Хотя сгенерированная сборка обычно одна и та же, они не эквивалентны и ее не следует рассматривать как сокращенную версию if. Проще говоря, используйте if, когда это возможно, и используйте только условный оператор, когда вам нужно разветвляться на выражениях.

Ответ 2

Это похоже на абстрактный оператор if, где ? проверяет правду и : is else... это так?

Да, почти. Он назывался "условным оператором" (иногда не совсем точно называемым "тернарным оператором", поскольку он является единственным тернарным оператором в С). Это не оператор , хотя это выражение , имеет значение. Он оценивает свой второй аргумент, если первый аргумент имеет значение true и его третий аргумент, если он ложный. Поэтому

sign = (s[i] == '-') ? -1 : 1;

эквивалентно

if (s[i] == '-') {
    sign = -1;
} else {
    sign = 1;
}

Ответ 3

Это тернарный оператор. (s[i] == '-') ? -1 : 1; возвращает -1, если s[i] == '-' и 1 в противном случае. Затем это значение присваивается sign. Другими словами, более длинный способ написать это:

int sign;

if(s[i] == '-')
{
  sign = -1;
}
else
{
  sign = 1;
}

Ответ 4

?: является условным оператором в C.

В вашем примере это даст тот же результат, что и этот оператор if:

if (s[i] == '-')
{
    sign = -1;
}
else
{
    sign = 1;
}

Ответ 5

sign = (s[i] == '-') ? -1 : 1;

является сокращением для:

if (s[i] == '-')
{
    sign = -1;
}
else
{
    sign = 1;
}