Member 12716966 Ответов: 2

Кто-нибудь скажет мне, почему пришел этот выход


тап_п()
{
int a=2;
int a1, a2,a3,a4;
a1 = ++a + a ; / / вывод 6 (OK)
a2 = ++a + a++; / / вывод 7 (OK)
a3 = ++a + a++ + a ; / / вывод 11 (OK)
a4 = ++a + a++ + a++; / / вывод 11 ( Почему ??? )
е("\п А1=%д, А2=%д, А3=%D и А4=%д,А1,А2,А3,А4);
возвращает 0;
}

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

Я хочу знать, как это отобразить, потому что я знаю значение++ отображение затем увеличить и ++увеличить значение первого затем показать значение. когда оба объединяются, то в первую очередь растут все а потом ставить разные значения и, наконец, поставить значение ++место. Я хочу знать последнее утверждение, как показать. Расскажи мне все подробно и шаг за шагом с ясным смыслом.

Автор-Аман Кумар

2 Ответов

Рейтинг:
1

OriginalGriff

В принципе, не делайте этого.
Проблема (особенно с более старыми языками, такими как с) заключается в том, что точный порядок, в котором "вещи происходят", не определяется языком.
В результате автор компилятора может свободно выполнять операции до и после инкремента и декремента по своему усмотрению - что не обязательно означает "немедленно" - вполне возможно, что они выполняются до, во время или после выполнения строки.
Когда вы добавляете, что компилятор волен оценивать свое выражение либо слева направо, либо справа налево (если только это не вынуждено правилами приоритета), и то, какое значение вы получаете, не будет определено или даже согласовано между двумя компиляторами, или даже двумя версиями одного и того же компилятора, или еще хуже: различно в зависимости от оптимизации!

И это Пита для чтения, а значит, ее трудно понять и поддерживать: разделите ее на разные строки, и пусть оптимизатор разберется!


Рейтинг:
1

Patrice T

Вы находитесь в серой зоне. В определении языка Си говорится, что компилятору разрешено изменять порядок элементов в выражении (и более), а поскольку ваше выражение зависит от порядка операций, результат не предсказуем. Другой компилятор даст другие результаты.

Используйте отладчик и отобразите сгенерированный ассемблерный код, чтобы увидеть, как был переведен ваш код.