ufm: (Default)
[personal profile] ufm
ufm@home ~ $ cat t.c
#include <stdio.h>

int main(void) {
int i;
volatile int j;

   i = j = 5;
   i = ++i + ++i;
   j = ++j + ++j;
   printf ("i == %d j == %d\n",i,j);

   i = j = 5;
   i = i++ + ++i;
   j = j++ + ++j;
   printf ("i == %d j == %d\n",i,j);

   i = j = 5;
   i = i++ + i++;
   j = j++ + j++;
   printf ("i == %d j == %d\n",i,j);

   i = j = 5;
   i = ++i + i++;
   j = ++j + j++;
   printf ("i == %d j == %d\n",i,j);

   return 0;
}

ufm@home ~ $ gcc t.c
ufm@home ~ $ ./a.out
i == 14 j == 13
i == 13 j == 11
i == 12 j == 10
i == 13 j == 12
ufm@home ~ $

(no subject)

Date: 2007-05-12 12:44 (UTC)
From: [identity profile] elk.livejournal.com
Можно или нельзя, но компилятор облажался, конечно.

(no subject)

Date: 2007-05-12 15:59 (UTC)
From: [identity profile] uncle-asa.livejournal.com
Где? Я не вижу ни одного нарушения стандарта.

(no subject)

Date: 2007-05-13 01:41 (UTC)
From: [identity profile] elk.livejournal.com
Операции над int и volatile int могут различаться результатом?

(no subject)

Date: 2007-05-13 03:36 (UTC)
From: [identity profile] uncle-asa.livejournal.com
А почему нет? Порядок вычисления оставлен стандартом на совесть оптимизатора. Во всех книжках написано, что результат непредсказуем.

(no subject)

Date: 2007-05-13 15:37 (UTC)
From: [identity profile] generos.livejournal.com
Не до такой же степени! :-)

(no subject)

Date: 2007-05-13 15:40 (UTC)
From: [identity profile] uncle-asa.livejournal.com
Нефиг-нефиг! Программировать красиво учитесь ;)

А то потом народ спрашивает нафига я конструкции вида u = (*p++) | (*p++ << 8); из кода выкидываю и у меня почему-то всё работает, а у них нет ;)