Оператор вопросительного знака в выражениях
K & R Second Edition (стр. 71) - я, должно быть, пропустил объяснение:
sign = (s[i] == '-') ? -1 : 1;
Контекст это функция, которая преобразует строку в double. Эта часть, в частности, возникает после того, как функция пропускает пробел. Я полагаю, что проверяет положительное или отрицательное значение и сохраняет его как -1 или +1 для преобразования знака в конце функции... return sign * val /power;
Я хотел бы сделать лучше, чем сделать вывод... Я особенно не знаю, что здесь делают ?
и : 1
(или где угодно, если на то пошло).
Это похоже на абстрактную инструкцию if
. Где ?
проверяет правду, а :
- else
... это так? Оно ограничено if/else
?
Я новичок, и я раньше не встречал синтаксис этого выражения, поэтому мне интересно, есть ли какая-то конкретная причина, по-видимому, его часто заменяют формальным if/else
- кроме того, возможно, читабельность?
Ответы
Ответ 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;
}