求大佬幫忙看一下
為什么列印出來的結果不一樣


uj5u.com熱心網友回復:
你這個照片上的干涉條紋看得我腦殼疼,就不能復制文本發上來嗎?問題大概出在i++上面,因為#define是直接替換的,所以第二張圖里的SQ(i++)會被替換成(i++)*(i++), 就多加了一次。
uj5u.com熱心網友回復:
供參考://帶引數的宏定義和函式之間有一定類似之處,但本質上有區別:
//1.函式呼叫時,先求出實參運算式的值,然后代入形參,而使用帶引數的宏只是進行字符替換。
//2.函式呼叫是在程式運行時處理的,為形參分配臨時的記憶體單元。而宏置換則是在預處理階段進行的,在置換時并不分配記憶體單元,
//不進行值的傳遞處理,也沒有“回傳值”的概念。
//3.對函式中的實參和形參都要定義型別,二者的型別要求一致,如不一致,應進行型別轉換。而宏不存在型別問題,宏名無型別,
//它的引數也無型別,只是一個符號代表,置換時,代入指定的字串即可。定義宏時,字串可以是任何型別的資料。
//4.呼叫函式只可得到一個回傳值,而用宏可以設法得到幾個結果。
//5.使用宏次數多時,宏展開后源程式變長,因為每展開一次都使程式增長,而函式呼叫不會使源程式變長。
//6.宏替換不占運行時間,只占預處理時間。而函式呼叫則占運行時間(分配單元、保留現場、值傳遞、回傳)。
#include<stdio.h>
#define SQ(y) ((y)*(y))
//帶引數的宏定義:帶引數的宏定義不是進行簡單的字串替換,還要進行引數替換
//#define S(r) PI*r*r
//area=S(a+b); → area=PI * a+b * a+b;
//#define S(r) PI*(r)*(r)
//area=S(a+b); → area=PI*(a+b)*(a+b);
int main()
{
int i=1;
while(i<=5){
printf("%d\n",SQ(i++));
//這句替換為:
//printf("%d\n",((i++)*(i++)));
}
return 0;
}
//2 i=1 -> while(i<=5) -> printf("%d\n",((i++)*(i++))); 1 * (i++)2 =2, i(i++)=3;
//12 i=3 -> while(i<=5) -> printf("%d\n",((i++)*(i++))); 3 * (i++)4 =12, i(i++)=5;
//30 i=5 -> while(i<=5) -> printf("%d\n",((i++)*(i++))); 5 * (i++)6 =30, i(i++)=6;
//請按任意鍵繼續. . .
uj5u.com熱心網友回復:
//呼叫函式時:
//1 i=1 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 1*1 =`1,i(i++) = 2;
//4 i=2 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 2*2 = 4,i(i++) = 3;
//9 i=3 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 3*3 = 9,i(i++) = 4;
//16 i=4 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 4*4 =16,i(i++) = 5;
//25 i=5 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 5*5 =25,i(i++) = 6;
//請按任意鍵繼續. . .
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260424.html
標籤:C語言
上一篇:Leetcode每日一題:485. 最大連續 1 的個數
下一篇:vs+sqlite
