унарные операторы в printf - PullRequest
       4

унарные операторы в printf

0 голосов
/ 26 января 2012

Может кто-нибудь объяснить мне вывод следующего.Я пытался все объяснить и могу объяснить более позднюю часть, где 'x' присваивается значение выражения, но не могу понять, как ответ отличается в выражении printf !!!

Различные компиляторы могут вести себя по-разному.Было бы замечательно, если бы кто-то мог объяснить это поведение для любого компилятора.

Я использую gcc (SUSE Linux) 4.6.2 на openSUSE 12.1 (Спаржа) (i586)

код:

#include<stdio.h>

int main()
{
unsigned int x=0;
printf("expr= %d x=%d\n",(x^x),x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
(x^=x);
printf("x=%d\n",x);
x=0;
(x^=x)||x++;
printf("x=%d\n",x);
x=0;
(x^=x)||x++||++x;
printf("x=%d\n",x);
x=0;
(x^=x)||x++||++x||x++;
printf("x=%d\n",x);

return 0;
}

вывод:

expr= 0 x=0
x=0
expr= 0 x=1
x=1
expr= 1 x=2
x=2
expr= 1 x=2
x=2
expr= 0 x=1
x=1
expr= 1 x=1
x=1
expr= 1 x=2
x=2
expr= 1 x=2
x=2
x=0
x=1
x=2
x=2

Спасибо

Ответы [ 2 ]

4 голосов
/ 26 января 2012

Вы вызываете неопределенное поведение .

В выражении, подобном func(a,b), стандарт C не определяет, какой аргумент должен оцениваться первым;компилятор может делать и то и другое.

Так что теперь рассмотрим func(x++,x);неизвестно, эквивалентно ли это:

a = x++;
b = x;
func(a,b);

или этому:

b = x;
a = x++;
func(a,b);
3 голосов
/ 26 января 2012
printf("expr= %d x=%d\n",(x^x)||x++||++x,x);

Эта функция показывает неопределенное поведение. Порядок оценки между (x^x)||x++||++x и x не указан.

Большинство других printf вызовов в вашей программе имеют ту же проблему.

(C99, 6.5.2.2) "Порядок вычисления обозначения функции, фактические аргументы и подвыражения внутри фактических аргументов не определены, но есть точка последовательности до фактического звонка. "

Программа, вывод которой зависит от неопределенного поведения, не является строго соответствующей программой (см. C99, 4.p5).

...