簡體   English   中英

printf中的一元運算符

[英]unary operators in printf

誰能解釋以下內容。 我試圖推理一切,並且可以解釋后面的部分,其中'x'被分配了表達式的值,但無法理解答案在printf語句中有何不同!!!

不同的編譯器的行為可能有所不同。 如果有人可以為任何編譯器解釋此行為,那就太好了。

我在openSUSE 12.1(蘆筍)(i586)上使用gcc(SUSE Linux)4.6.2

代碼:

#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

謝謝

您正在調用未指定的行為

在諸如func(a,b)類的表達式中,C標准未指定應首先評估哪個參數。 編譯器可以隨意執行任何操作。

所以現在考慮func(x++,x) ; 不確定是否等效於此:

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

或這個:

b = x;
a = x++;
func(a,b);
printf("expr= %d x=%d\n",(x^x)||x++||++x,x);

此功能顯示未指定的行為。 (x^x)||x++||++xx之間的評估順序未指定。

程序中的其他大多數printf調用都存在相同的問題。

(C99,6.5.2.2)“未指定函數指定符,實際參數和實際參數中的子表達式的求值順序,但在實際調用之前有一個順序點。”

輸出依賴於未指定行為的程序不是嚴格符合要求的程序(請參閱C99,4.p5)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM