порядок оценки операндов + побочный эффект присваивания - PullRequest
1 голос
/ 05 июня 2010

Я хочу, чтобы следующий код печатал 11, но печатал 12, за исключением последнего случая, где печатается 10.

x=5; x1=x+(x=6); printf("%d\n",x1);  
x=5; x1=(x=x)+(x=6); printf("%d\n",x1);  
x=5; x1=(x+0)+(x=6); printf("%d\n",x1);  
x=5; x1=(x=5)+(x=6); printf("%d\n",x1);  

x=5; x1=(x=6)+x; printf("%d\n",x1);  
x=5; x1=(x=6)+(x=x); printf("%d\n",x1);  
x=5; x1=(x=6)+(x+0); printf("%d\n",x1);  
x=5; x1=(x=6)+(x=5); printf("%d\n",x1);  

gcc в каждом случае говорит: «предупреждение: операция с« x »может быть неопределенной».

Это значит.

Бернхард

PS: Нет вопросов, извините. Спасибо за ваши ответы. :)
PPS: Фактический код:

while ( data-(data=read(adr)&(1<<6)) ) i++;  

Я жду, пока бит 6 в adr перестанет переключаться.

Ответы [ 3 ]

2 голосов
/ 05 июня 2010

Результаты не определены, дальнейшее объяснение не требуется. Но для объяснения двух возможных способов компилятор может обработать ваш код:

int x = 1;
int n = (x=3) + x;

Компилятор может сначала оценить (x = 3), в этом случае присваивание n имеет значение 6. Или оно может сначала оценить x, и в этом случае присвоение n имеет значение 4.

2 голосов
/ 05 июня 2010

Есть причина для предупреждения ... Порядок оценки между точками последовательности не указан.

1 голос
/ 05 июня 2010

Вы можете использовать малоиспользуемый оператор запятой вместе с другой переменной, чтобы написать нужный цикл:

while ( lastdata = data, lastdata != (data = read(adr) & (1<<6)) ) i++;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...