我們一行一行分析:
成都創(chuàng)新互聯(lián)公司專注于融安網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供融安營銷型網(wǎng)站建設(shè),融安網(wǎng)站制作、融安網(wǎng)頁設(shè)計、融安網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造融安網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供融安網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
for (x = 5; x 0; x--) //從x=5開始,當(dāng)x0的值為false時停止循環(huán)。每次循環(huán)后x自減。
if (x-- 5) printf("%d", x); //x--的值就等于x,也就是說第一次是不執(zhí)行的。這個語句同時也會將x自減。
else printf("%d", x++); //x++的值也等于x,但同時也會將x自增。第一次會執(zhí)行這個語句,輸出為x-1(等于4),因?yàn)樵谂袛嗾Z句中x自減了。
所以,第一輪輸出為4。
第二輪,x因?yàn)閒or循環(huán)自減了,此時x-- 5也已滿足,又因?yàn)樵谏弦惠喲h(huán)中加1,因此輸出4+1-1-1=2;
第三輪與第二輪相似,不同之處在于沒有執(zhí)行printf("%d", x++),因此x的值減2,輸出1
函數(shù)定義的一般形式
1. 無參函數(shù)的定義形式
類型標(biāo)識符 函數(shù)名()
{聲明部分
語句
}
其中類型標(biāo)識符和函數(shù)名稱為函數(shù)頭。類型標(biāo)識符指明了本函數(shù)的類型,函數(shù)的類型實(shí)際上是函數(shù)返回值的類型。 該類型標(biāo)識符與前面介紹的各種說明符相同。函數(shù)名是由用戶定義的標(biāo)識符,函數(shù)名后有一個空括號,其中無參數(shù),但括號不可少。
{}中的內(nèi)容稱為函數(shù)體。在函數(shù)體中聲明部分,是對函數(shù)體內(nèi)部所用到的變量的類型說明。
在很多情況下都不要求無參函數(shù)有返回值,此時函數(shù)類型符可以寫為void。
我們可以改寫一個函數(shù)定義:
void Hello()
{
printf ("Hello,world \n");
}
這里,只把main改為Hello作為函數(shù)名,其余不變。Hello函數(shù)是一個無參函數(shù),當(dāng)被其它函數(shù)調(diào)用時,輸出Hello world字符串。
2. 有參函數(shù)定義的一般形式
類型標(biāo)識符 函數(shù)名(形式參數(shù)表列)
{聲明部分
語句
}
有參函數(shù)比無參函數(shù)多了一個內(nèi)容,即形式參數(shù)表列。在形參表中給出的參數(shù)稱為形式參數(shù),它們可以是各種類型的變量,各參數(shù)之間用逗號間隔。在進(jìn)行函數(shù)調(diào)用時,主調(diào)函數(shù)將賦予這些形式參數(shù)實(shí)際的值。形參既然是變量,必須在形參表中給出形參的類型說明。
例如,定義一個函數(shù),用于求兩個數(shù)中的大數(shù),可寫為:
int max(int a, int b)
{
if (ab) return a;
else return b;
}
第一行說明max函數(shù)是一個整型函數(shù),其返回的函數(shù)值是一個整數(shù)。形參為a,b,均為整型量。a,b的具體值是由主調(diào)函數(shù)在調(diào)用時傳送過來的。在{}中的函數(shù)體內(nèi),除形參外沒有使用其它變量,因此只有語句而沒有聲明部分。在max函數(shù)體中的return語句是把a(bǔ)(或b)的值作為函數(shù)的值返回給主調(diào)函數(shù)。有返回值函數(shù)中至少應(yīng)有一個return語句。
在C程序中,一個函數(shù)的定義可以放在任意位置,既可放在主函數(shù)main之前,也可放在main之后。
例如:
可把max 函數(shù)置在main之后,也可以把它放在main之前。修改后的程序如下所示。
【例8.1】
int max(int a,int b)
{
if(ab)return a;
else return b;
}
main()
{
int max(int a,int b);
int x,y,z;
printf("input two numbers:\n");
scanf("%d%d",x,y);
z=max(x,y);
printf("maxmum=%d",z);
}
現(xiàn)在我們可以從函數(shù)定義、函數(shù)說明及函數(shù)調(diào)用的角度來分析整個程序,從中進(jìn)一步了解函數(shù)的各種特點(diǎn)。
程序的第1行至第5行為max函數(shù)定義。進(jìn)入主函數(shù)后,因?yàn)闇?zhǔn)備調(diào)用max函數(shù),故先對max函數(shù)進(jìn)行說明(程序第8行)。函數(shù)定義和函數(shù)說明并不是一回事,在后面還要專門討論。 可以看出函數(shù)說明與函數(shù)定義中的函數(shù)頭部分相同,但是末尾要加分號。程序第12 行為調(diào)用max函數(shù),并把x, y中的值傳送給max的形參a, b。max函數(shù)執(zhí)行的結(jié)果(a或b)將返回給變量z。最后由主函數(shù)輸出z的值。
8.3 函數(shù)的參數(shù)和函數(shù)的值
8.3.1 形式參數(shù)和實(shí)際參數(shù)
前面已經(jīng)介紹過,函數(shù)的參數(shù)分為形參和實(shí)參兩種。在本小節(jié)中,進(jìn)一步介紹形參、實(shí)參的特點(diǎn)和兩者的關(guān)系。形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時,主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。
函數(shù)的形參和實(shí)參具有以下特點(diǎn):
1. 形參變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。
2. 實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。
3. 實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會發(fā)生類型不匹配”的錯誤。
4. 函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。 因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會變化。
【例8.2】可以說明這個問題。
main()
{
int n;
printf("input number\n");
scanf("%d",n);
s(n);
printf("n=%d\n",n);
}
int s(int n)
{
int i;
for(i=n-1;i=1;i--)
n=n+i;
printf("n=%d\n",n);
}
本程序中定義了一個函數(shù)s,該函數(shù)的功能是求∑ni的值。在主函數(shù)中輸入n值,并作為實(shí)參,在調(diào)用時傳送給s 函數(shù)的形參量n( 注意,本例的形參變量和實(shí)參變量的標(biāo)識符都為n,但這是兩個不同的量,各自的作用域不同)。在主函數(shù)中用printf 語句輸出一次n值,這個n值是實(shí)參n的值。在函數(shù)s中也用printf 語句輸出了一次n值,這個n值是形參最后取得的n值0。從運(yùn)行情況看,輸入n值為100。即實(shí)參n的值為100。把此值傳給函數(shù)s時,形參n的初值也為100,在執(zhí)行函數(shù)過程中,形參n的值變?yōu)?050。返回主函數(shù)之后,輸出實(shí)參n的值仍為100??梢妼?shí)參的值不隨形參的變化而變化。
#include?stdio.h??
struct?complex??
{??
int?re;??
int?im;??
};??
void?add(struct?complex?a,?struct?complex??b,?struct?complex?*c)
{
c-re=a.re+b.re;
c-im=a.im+b.im;
}
void?minus(struct?complex?a,?struct?complex??b,?struct?complex?*c)
{
c-re=a.re-b.re;
c-im=a.im-b.im;
}
int?main()??
{??
struct?complex?x,y,s,p;??
scanf("%d%d",x.re,x.im);??
scanf("%d%d",y.re,y.im);??
add(x,y,s);?
printf("???sum=%5d+%5di\n",s.re,s.im);??
minus(x,y,p);
printf("???product=%5d+%5di\n",p.re,p.im);??
return?0;??
}
計算:從右往左,并輸出到“緩沖區(qū)”。
1、緩沖區(qū)是一堆棧
2、第一步:處理后面的“i--”。8進(jìn)入緩沖區(qū),i=7。緩沖區(qū):8 -(指針)
第二步:處理“i++”。7進(jìn)入緩沖區(qū),i=8。緩沖區(qū):7 8-
第三步:處理”--i“。8進(jìn)入緩沖區(qū),i=7.緩沖區(qū):8 7 8
第四步:處理“++i” ?先自增1,然后8進(jìn)入緩沖區(qū),i=8 .緩沖區(qū): 8 8 7 8
3、輸出緩沖區(qū)數(shù)據(jù)(棧規(guī)則):8 8 7 8
另外自增 、自減 、還可能和編譯器有關(guān)系 。
擴(kuò)展資料:
后綴表達(dá)式 2級
postfix-expression [ expression ],數(shù)組下標(biāo)運(yùn)算。
postfix-expression ( argument-expression-list),函數(shù)調(diào)用,括號內(nèi)的參數(shù)可選。
postfix-expression . identifier,成員訪問,
postfix-expression - identifier,成員訪問,-號之前應(yīng)為指針。
postfix-expression ++,后綴自增
postfix-expression --,后綴自減
( type-name ) { initializer-list }
( type-name ) { initializer-list , } 復(fù)合初始化,C99后新增。
參考資料:百度百科-C語言運(yùn)算符
my_fread明顯是自己寫的函數(shù),int fread 是庫提供的函數(shù),其實(shí)就是別人寫好的函數(shù),你可以直接使用。具體的功能,庫函數(shù)實(shí)現(xiàn)的功能是一定的,比如說atoi 就是實(shí)現(xiàn)將字符串轉(zhuǎn)為整形,printf就是在屏幕上實(shí)現(xiàn)輸出。非庫函數(shù)的函數(shù)所完成的功能,要具體看代碼里是怎么實(shí)現(xiàn)的。比如說printf,在嵌入式里常被從寫為用作從串口打印輸出數(shù)據(jù), 而不是標(biāo)準(zhǔn)庫里的屏幕輸出。但功能都是為了輸出,看到數(shù)據(jù),用作調(diào)試。
如果還不明白,那么下面的代碼第一個my_fread什么功能都沒有完成,而第二個的功能和庫函數(shù)fread 的功能完全一樣,用于從文件讀取數(shù)據(jù)。
size_t my_fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
{
return 0;
}
size_t my_fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
{
int fread(void *ptr,int size,int count,FILE *stream);
}
所以,函數(shù)名字并不代表什么哦,具體要看代碼的實(shí)現(xiàn),即函數(shù)的內(nèi)容。windows編程只提供函數(shù)名字供你使用,也稱為接口,而具體實(shí)現(xiàn)的方式,即函數(shù)的內(nèi)容你是看不到的,就像標(biāo)準(zhǔn)庫函數(shù)一樣,他會告訴你這個接口怎么用,完成什么功能,但不會像庫函數(shù)一樣,讓你看到具體的代碼,都是封裝起來的。而linux源碼開放就是說你不僅可以使用,還可以看到這些函數(shù)具體的實(shí)現(xiàn),具體的內(nèi)容。