Немного про undefined behavior
Jun. 9th, 2011 07:07 pm
extern int a,b;
void f(void) {
a = (a++) % b;
}
При входных значениях a=19, b=5 значение a в результате:
gcc3.4, tcc, clang2.9, SunC++, C#: 4
gcc4.*: 20
SunC, IntelC 10.1: 5
судя по задумке автора, должно было получиться 5. Хотя это зависит от конкретного применённого психоактивного вещества...
(Оригинал - ныне удалённый драйвер в staging linux)
no subject
Date: 2011-06-09 06:01 pm (UTC)1. Читаем значение a в R0.
2. Читаем значение b в R1.
3. Вычисляем остаток R0 % R1 и записываем в a.
4. Инкрементируем R0 и записываем в a.
Да, присваивание не создаёт sequence point (в новом стандарте этого термина нет, не знаю, что вместо него). Это естественно, если вспомнить распространённость и идиоматичность выражений вроде
while(*p++=*q++);.