Dinesh Sahoo Ответов: 2

Почему выход равен 37 ?


пустота главная()
{
int a=10,b;
Б=а++ + ++а+ а ++;
printf("%d",a);
}

Что я уже пробовал:

пустота главная()
{
int a=10,b;
Б=а++ + ++а+ а ++;
printf("%d",a);
}

2 Ответов

Рейтинг:
1

Patrice T

Никогда не используйте несколько инкрементов/декрементов для одной и той же переменной внутри формулы, результат непредсказуем с помощью C.

b=++a + ++a+ ++a;

Потому что C может переписать код, b может быть где-то между 33 и 39.
Результат будет варьироваться между компиляторами и в зависимости от параметров компилятора.


CPallini

5.

Patrice T

Спасибо

Рейтинг:
0

Suvendu Shekhar Giri

Это неправильно!

Ваша программа будет печатать 13.
Это потому что вы печатаете "ля" нет "б".

Теперь предположим, что вы хотели бы знать результат b, Я полагаю.
Во - первых, не рекомендуется использовать этот вид одних и тех же переменных до/после инкремента несколько раз в выражении, так как это создает путаницу, а также делает его менее читаемым.

Однако давайте посмотрим, почему это происходит.

Если вы проверите результат следующего-

b=++a + ++a

вы увидите, что b напечатает 24 вместо ожидаемых 23. Это потому, что при первом выполнении он будет считать 2 операнда и принимать их за сложение. Теперь, поскольку предварительное приращение имеет более высокий приоритет, значение a будет увеличено до 7 (из-за двойного предварительного приращения). Операция сложения теперь добавит a дважды , то есть a + a, что равно 24.


Теперь рассмотрим случай, когда b=++a + ++a+ ++a.
Первые 2 операнда будут извлечены и добавлены, что даст результат 24 (как мы видели выше) и будет сохранено во временной переменной. Затем он выберет 3-й операнд, который сейчас 13, и добавит его к значению, хранящемуся в переменной temp.
итак, 24+13=37.

Резюме:
Примечание: оценка выражения начинается с правого конца.
Б=а++ + ++а+ а ++;
=> b = ++a + (++a + ++a)
=> b = ++a + (++a + (a=11))
=> b = ++a + (temp=((a=12) + a))
=> b = ++a + (temp=(12+12=24))
=> b = ++a + temp)
=> b = (a=13) + temp
=> b = 13 + 24


Надежда, она проясняет сомнения.

Другие члены сообщества, пожалуйста, дайте мне знать, если я ошибаюсь. Пожалуйста используйте раздел комментариев вместо голосования вниз ;)


Richard MacCutchan

Вы не (полностью) неправы. Но вы ошибаетесь в том смысле, что компилятор не гарантирует, что он будет делать это в таком порядке. Правило таково: Не используйте несколько инкрементов декрементов в одном выражении.

Suvendu Shekhar Giri

Правда. Спасибо!

Dinesh Sahoo

в некоторых компиляторах выход равен 39.