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

Часть кода из программы на си. Что выведет printf и почему? int num = 1; printf("%d\n", num++ -num);

Результат неизвестен: классическое неопределённое поведение. Операнды арифметической операции могут вычисляться в любом порядке. Потому неизвестно, какую часть выражения (num++) - (num) код, сгенерированный компилятором, вычислит раньше.

Если сначала (num++), а потом (num) - поучим в ответе -1

А если сначала (num), а потом (num++) - получим в ответе 0.

P.S. И это одна из причин, почему языки с Си-подобным синтаксисом совершенно не годятся для начального обучения программированию.
СБ
Сергей Бурлаченко
98 000
Лучший ответ
Максат Салыков Мой первый язык Си, второй C++ :) - для изучения годятся, просто порог вхождения выше.
Такой подвох можно встретить на тесте квалификации программиста. А преподавателя, который дает такие примеры и рассчитывает на определенный ответ, надо заменять.
Мой Dev-C++ выдал в ответе -1, но это совершенно не обязательно :)
АТ
Адик Ташиев
99 336
Максат Салыков В данной ситуации этим преподавателем являюсь я:) т. е. я знаю ответ на вопрос, просто решил посмотреть, что мне ответят:)
Думал в компиляторе борланда другое покажет, а нет, тот же глюк. Буквально сразу +1 делает, но если написать
int x = num++ -num;
printf("x=%d\n", x);
То все согласно правилам и +1, inc то бишь, поставит законно в конце.
Так лучше не писать - возможны побочные эффекты и на разных компиляторах и с различной оптимизацией результат может быть разным.
А почему бы вам просто не избегать таких сомнительных конструкций, Си ведь придуман для избежания рутины при программировании на Ассемблере, а не для того чтобы жестко указывать что можно делать а что нельзя, если не нравится наличие неопределенностей, выберите какой-нибудь C#, Паскаль или прочую лабуду.
Максат Салыков Кто сказал, что мне что-то не нравится? Я просто задал вопрос.