У мене виникає питання, як компілятор працює з таким кодом:
#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.Відповідно до стандарту С (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, оскільки після перевірки значення 'c' збільшується (c + 1 = 12) і лише після цього він встановлює значення 'd' як c (12) -1, що становить 11.
Якщо ви використовували, наприклад:
int d = (b == ++c) ? (c+1) : (c-1);
Значення "c" було б збільшено до перевірки твердження, тому було б істинним, а значення "d" було б c (12) +1, що становить 13.