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 04:22 pm (UTC)
From: [identity profile] dmih.livejournal.com
Ой, я помню у меня на ARM-е выражение что-то типа (*int)some-char[x] себя вело как хотело, в зависимости от выравненности адреса по 4-байтному слову. В зависимости от используемой библиотеки (и следовательно обработчика аппаратного исключения, на котором оно там в основном падало), оно либо падало, либо возвращало ноль всегда, либо сдвигала x влево до выравнивания.

Date: 2011-06-09 04:45 pm (UTC)
From: [identity profile] gul-kiev.livejournal.com
20 особенно удивляет.
Разве по стандарту не должно сначала полностью вычисляться значение правой части присваивания, а потом выполняться собственно присваивание? То есть, разве результаты, отличные от 4, не являются багами?

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++);.

Date: 2011-06-09 07:58 pm (UTC)
From: [identity profile] egorfine.livejournal.com
V8 3.4 = 4.

Date: 2011-06-09 08:33 pm (UTC)
From: [identity profile] netch80.livejournal.com
Что конкретно имеется в виду под V8?

Date: 2011-06-09 10:28 pm (UTC)
From: [identity profile] egorfine.livejournal.com
Google V8 - восьмицилиндровый javascript

Date: 2011-06-10 03:19 am (UTC)
From: [identity profile] andy-scott.livejournal.com
приколисты

а что тут такого undefined - все вроде корректно написано в коде

Date: 2011-06-10 07:12 am (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Значение переменной изменяется дважды в одном выражении.

Date: 2011-06-10 07:19 am (UTC)
From: [identity profile] andy-scott.livejournal.com
наверное я просто туплю, но разве неписаное правило "слева направо" и "скобки прежде всего" не работает? excuse me for my ignorance, pls

Date: 2011-06-10 08:05 am (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Писаные правила не такие. А "справа налево" вообще им противоречит.

Date: 2011-06-10 06:16 am (UTC)
From: [identity profile] e1am0.livejournal.com
ггг. а я поскольку неудосужился изучить все тонкости языка, писал на сях практически как в басике чуть ли не по операции на строчку. на всякий пожарный. но такие вещи впечатляют конечно

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. 2nd, 2026 08:43 pm
Powered by Dreamwidth Studios