netch80: (Default)
[personal profile] netch80
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)

Date: 2011-06-09 06:01 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Всё правильно, undefined behavior — undefined. И даже можно понять логику:

1. Читаем значение a в R0.
2. Читаем значение b в R1.
3. Вычисляем остаток R0 % R1 и записываем в a.
4. Инкрементируем R0 и записываем в a.

Да, присваивание не создаёт sequence point (в новом стандарте этого термина нет, не знаю, что вместо него). Это естественно, если вспомнить распространённость и идиоматичность выражений вроде while(*p++=*q++);.

Profile

netch80: (Default)
netch80

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 3rd, 2026 02:10 am
Powered by Dreamwidth Studios