Другие языки программирования и технологии

Почему эта программа Си выдает не такой результат?

#include
#include

void main(void) {
int a, b, c;
printf("Vvedite dva celih chisla: ");
scanf("%d %d", &a, &b);
c = --a + a * b + --b;
printf("a=%d, b=%d, c=%d", a, b, c);
getch();
}
Должно выходить 47, а выходит 54 почему?
Результат зависит от входных данных. Какие входные данные неизвестно.
Результат зависит от компилятора. Возможно, программа написана некорректно, или не все компиляторы следуют стандарту. Я стандарт не читал.
Тут https://rextester.com/l/c_online_compiler_visual можно выполнить на разных компиляторах. Результат Visual C отличается от GCC. На этом сайте надо вводить входные данные перед запуском (кнопка [ + ] Show input).
Petru Besleaga
Petru Besleaga
58 065
Лучший ответ
Потому, что выражение c = --a + a * b + --b; - это НЕОПРЕДЕЛЁННОЕ ПОВЕДЕНИЕ. И его результат - всё, что угодно, включая погоду на Марсе.

То, в какой последовательности ты записал операнды, имеет значение только для ||, && и ?:. Во всех остальных случаях компилятор плюёт на то, как именно ты записал выражение и вычисляет его так, как ему удобнее. Например, он может сначала вычислить --a и --b, а потом a * b. А может сначала вычислить a * b, а потом --a и --b. И результаты в каждом из этих случаев будут разными.

c = --a + --b; // корректно
c = a + --b; // корректно
c = --a + b; // корректно
c = --a + a + --b; // НЕкорректно
c = --a + b + --b; // НЕкорректно
c = --a + a * b + --b; // НЕкорректно
.* Aр)(@ngeл *.
.* Aр)(@ngeл *.
69 064
c = --a + a * b + --b; - за такое надо бить по рукам.
Тут результат не определен. Никогда не используй инкремент и декременты вместе с мат. выражениями.
Sergey Mikhailov
Sergey Mikhailov
30 477