《C語言解惑》之 謎題2 3 其他型別的轉換

2021-04-13 07:08:41 字數 1589 閱讀 5140

謎題2.3 其他型別的轉換

請問,下面這個程式的輸出是什麼?

#include

#define pr(x) printf(#x " = %g/t",(double)(x))

#define nl putchar(』/n』)

#define print1(x1) pr(x1); nl

#define print2(x1,x2) pr(x1); print1(x2)

main()

輸出:x = 2     y = 1       (2.3.1)

x = 1.6   y = 3        (2.3.2)

y = 2            (2.3.3)

x = 0     y = 0           (2.3.4)

解惑2.3 其他型別的轉換

2.3.1

初始值:d=3.2,i=2

x = (y=d/i) *2

(x = (y=3.2/2) *2)

(x = (y=1.6) *2)

3.2是乙個double浮點數,2是乙個int整數;從資料型別上講,前者比後者高。因此,它們的商將是乙個double浮點數。

(x = 1*2), 此時y=1

y是乙個int整數,它是捨棄了1.6的小數部分而得到的。

(x = 2)

2, 此時x=2

2.3.2

初始值:d=3.2,i=2

y = (x=d/i) *2

(y = (x=1.6) *2)

(y = 1.6*2), 此時x=1.6

因為x是乙個double浮點數,所以這個賦值操作的結果也將是乙個double浮點數。

(y = 3.2)

1.6是乙個double浮點數。

3, 此時y=3

y是乙個int整數,它是捨棄了3.2的小數部分而得到的。

2.3.3

初始值:d=3.2,i=2

y = d * (x=2.5/d)

(y = d * (x=2.5/d) )

(y = d * 2.5 / d ), 此時x=2.5/d

因為x是乙個double浮點數,所以2.5/d的精確度將得到保留。

(y = 2.5)

2, 此時y=2

y是乙個int整數,它是捨棄了2.5的小數部分而得到的。

2.3.4

初始值:d=3.2, i=2

x = d * (y = ((int) 2.9 + 1.1) / d)

(x = d * (y = (2 + 1.1) / d) )

型別轉換操作的優先順序高於「+」。

(x = d * (y=3.1/d) )

(x = d * (y= 乙個小數) )

(x = d*0), 此時y=0

不管那「乙個小數」是多少,y都將等於0;這是因為那「乙個小數」是0到1之間的乙個值。

0, 此時x=0

型別的混合使用:到目前為止,在同乙個表示式裡混合使用浮點數和整數會導致令人吃驚的結果的例子我們已經見得夠多了。在進行算術運算的時候,最好避免混合使用不同型別的運算元。如果你必須那樣做,就應該小心地使用型別轉換操作符對有關的運算元明確地進行型別轉換。 

C 語言的謎題

1 下面的程式並不見得會輸出 hello std out,你知道為什麼嗎?include include int main return 0 參 stdout和stderr是不是同裝置描述符。stdout是塊裝置,stderr則不是。對於塊裝置,只有當下面幾種情況下才會被輸入,1 遇到回車,2 緩衝...

C語言的謎題

1 下面的程式並不見得會輸出 hello std out,你知道為什麼嗎?include include int main return 0 參 stdout和stderr是不是同裝置描述符。stdout是塊裝置,stderr則不是。對於塊裝置,只有當下面幾種情況下才會被輸入,1 遇到回車,2 緩衝...

C語言的謎題

本篇文章 c語言的謎題 展示了14個c語言的迷題以及答案,應該是足夠清楚的,而且我也相信有相當的一些例子可能是我們日常工作可能會見得到的。通過這些迷題,希望你能更了解c語言。如果你不看答案,不知道是否有把握回答各個謎題?讓我們來試試。1 下面的程式並不見得會輸出 hello std out,你知道為...