你用的都是宏定義,宏定義編譯的時候替換的。具體到你這個問題,PRINT1(FUDGE(5)*x);
創(chuàng)新互聯(lián)公司主要從事做網(wǎng)站、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)肇州,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
是這樣替換的,F(xiàn)UDGE(5)*x這個整體作為參數(shù)宏定義里的參數(shù)a,這里面還有一個參數(shù)宏FUDGE(5),它是這么替換的,2.84+5。而在PRINT1這個宏里,替換后的參數(shù)為2.84+5*2。又因為你是int類型,所以輸出為12。
一些建議:
宏里面只是簡單替換,不會幫你改變運算順序,如果需要請用小括號改變相關(guān)運算順序。
PRINT1(FUDGE(5)*x);修改為PRINT1( ( FUDGE(5) ) *x);看看。
宏參數(shù)記得加上小括號。#define FUDGE(y) 2.84+y中的y寫成 2.84+(y)
希望對你有所幫助。
FUDGE(5)*y展開時變成
2.84+5*y
=2.84+5*2
=12.84
所以結(jié)果是12。
應(yīng)該這樣這樣定義:
#define FUDGE(y) (2.84+y)
則FUDGE(5)*y
=(2.84+5)*2
=15.68
結(jié)果是15.
38
將宏定義帶入即可。
PRINT1(FUDGE(5)*x);
=
PR(FUDGE(5)*x);putchar('\n');
=
printf("%d",(int)(FUDGE(5)*x));putchar('\n');
=
printf("%d",(int)(2.84+5*x));putchar('\n');
x值為2, 2.84+5*x=12.84 轉(zhuǎn)為int為12
于是這里輸出12
選B
39
這里有兩個i,中間{}里面用的i,和外面用的i不同。
執(zhí)行第一個printf 打印外面的i值,1, 打印后,i自加為2
執(zhí)行中間的{} i+=j*2 i=i+j*2=0+6=6
輸出i和j,也就是6,3
然后輸出下一個i和j,注意 這里是i是{}外面的i, 也就是自加后的2,
這里輸出2,3
于是 輸出
1,6,3,2,3
選B
注意,這里第一個和第二個printf少打了一個逗號按照現(xiàn)在程序 實際上輸出的是
16,32,3
#include stdio.h
#define FUDGE(y) 2.84+y
#define PR(a) printf("%d",(int)(a))
#define PRINT1(a) PR(a);putchar('\n')
main()
{
int x=2;
PRINT1(FUDGE(5)*x);
}
對于以上程序 結(jié)果應(yīng)該是12
要說明的是,F(xiàn)UDGE(y)等不是普通的函數(shù),而是預(yù)編譯宏,執(zhí)行時不能按一般的算法思維
預(yù)編譯是在程序編譯之前就進行替換的,即
FUDGE(5)*x
在編譯之前被替換成了
2.84+5*x,而不是(2.84+5)*x
這樣在進行真正的編譯的時候2.84+5*x=2.84+5*2=12.84
然后經(jīng)過int強制轉(zhuǎn)化變成12輸出 o(∩_∩)o...