У меня вопрос, как компилятор работает со следующим кодом:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Я не знаю , почему результат d = 11
.
У меня вопрос, как компилятор работает со следующим кодом:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Я не знаю , почему результат d = 11
.
Ответы:
В
int d = (b == c++) ? (c+1) : (c-1);
:c++
является текущим значениемc
11. Отдельноc
увеличивается до 12.b == 11
ложно, такb
как 12.(b == c++)
как ложно,(c-1)
используется. Кроме того, увеличениеc
до 12 должно быть завершено к этому моменту.c
это 12,c-1
это 11.d
инициализируется до этого значения, 11.источник
Согласно стандарту C (6.5.15 Условный оператор)
Так в инициализирующем выражении этой декларации
переменная
b
сравнивается со значением переменной,c
потому что оператор постинкрементного возвращает значение своего операнда перед его увеличением.Поскольку значения не равны друг другу (
b
установлено значение 12, аc
установлено значение 11), то подвыражение(c-1)
оценивается.В соответствии с цитатой есть точка последовательности после оценки состояния оператора. Это означает, что после оценки условия
c
имеет значение12
после применения к переменной оператора постинкрементаc
. В результате переменная d инициализируется значением1
(12 - 1
).источник
?:
. Потому что обычно в C объединение++
с другими операциями над одним и тем же операндом является неопределенным поведением. И этот код работает только предсказуемо, потому что он?:
имеет различные специальные правила снежинки.Поскольку условие является ложным, следовательно
false
, произойдет случай:,c-1
но, поскольку вы увеличилиc
условие наc++
, следовательноc
, теперь12
. Результат, таким образом, 12 - 1, что составляет 11.РЕДАКТИРОВАТЬ: То, что ОП неправильно понял, был пост увеличение.
Так что на самом деле происходит так:
источник
c++
в условии. Условие ложно, но тогда для вычисления используется оригинальное значение , а не увеличенная версия.c
c - 1
c++
и++c
c++
является пост -increment оператора. Значениеc++
составляет 11, с побочным эффектом изготовленияc == 12
.++c
будет иметь значение 12.Переведенный в обычный оператор if ваш код будет выглядеть так:
Подсказка здесь в том, что c увеличивается после проверки условия. Таким образом, вы вводите
else
состояние, но c уже имеет значение 12 там.источник
Обратитесь к Тернарному Оператору.
Синтаксис
Итак, вы написали
В этой ситуации результатом будет 11, потому что после проверок if значение 'c' увеличивается (c + 1 = 12) и только после этого оно устанавливает значение d в качестве c (12) -1, которое равно 11.
Если вы использовали, например:
Значение «c» будет увеличено перед проверкой оператора, поэтому оно будет истинным, а значение «d» будет равно c (12) +1, что равно 13.
источник