У меня вопрос, как компилятор работает со следующим кодом:
#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 Условный оператор)
4 Первый операнд оценивается; между оценкой и оценкой второго или третьего операнда существует точка последовательности (в зависимости от того, что оценивается). Второй операнд оценивается, только если первый сравнивается с неравным 0; третий операнд оценивается, только если первый сравнивается равным 0; результатом является значение второго или третьего операнда (в зависимости от того, что оценивается), преобразованное в тип, описанный ниже. 110)
Так в инициализирующем выражении этой декларации
int d = (b == c++) ? (c+1) : (c-1);
переменная 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.
РЕДАКТИРОВАТЬ: То, что ОП неправильно понял, был пост увеличение.
Так что на самом деле происходит так:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d;
if (b == c) { // 12 == 11 ? -> false
c = c + 1;
d = c + 1;
} else { // this executes since condition is false
c = c + 1; // post increment -> c++ -> c = 12 now
d = c - 1; // 12 - 1 = 11 -> d = 11
}
printf("d = %i\n", d);
}
c++
в условии. Условие ложно, но тогда для вычисления используется оригинальное значение , а не увеличенная версия. c
c - 1
c++
и++c
c++
является пост -increment оператора. Значение c++
составляет 11, с побочным эффектом изготовления c == 12
. ++c
будет иметь значение 12.
Обратитесь к Тернарному Оператору.
Синтаксис
состояние ? value_if_true: value_if_false
Итак, вы написали
int d = (b == c++) ? (c+1) : (c-1);
В этой ситуации результатом будет 11, потому что после проверок if значение 'c' увеличивается (c + 1 = 12) и только после этого оно устанавливает значение d в качестве c (12) -1, которое равно 11.
Если вы использовали, например:
int d = (b == ++c) ? (c+1) : (c-1);
Значение «c» будет увеличено перед проверкой оператора, поэтому оно будет истинным, а значение «d» будет равно c (12) +1, что равно 13.