1. 程式人生 > 其它 >小白必備之對函式中return等的使用 ——C語言

小白必備之對函式中return等的使用 ——C語言

技術標籤:c語言

小白必備之對return和函式的使用 ——C語言

從簡單的hello world 程式說起

#include <stdio.h>
int main( )

{

     printf( "Hello World!" );

     return 0;
}

這是所有學C語言的人寫的第一個程式,初學時就注意到這裡有個**return 0;**而經過實驗,彷彿不加 return 0; 也能執行,那麼它存在的必要性是什麼呢?我們要搞明白這個東西要搞清楚一個概念——函式。
C語言將函式稱為Function,其中文意思不僅有函式的意思,還有個意思是功能。關於C語言函式的說法有很多,但對於初學者是晦澀難懂的,我們在此借用高中對函式的理解,和大家分享一下如何理解函式。

在這裡插入圖片描述
相信大家對這個式子非常熟悉,我們再看看C語言裡面函式的樣子

int Function(int a)
{
    int b=-a;
    return b;
}

我們對比一下:

C語言中學學的函式
Functionf
ax
by

可以看到C語言裡面的引數框中的變數 int a,即為普通函式的自變數x,Function不過是普通函式的函式名,return後面跟著的b不就是求得的函式值嗎?由此我們可以得到一個有用的資訊,return返回的是你這個函式得到的最終結果。
而我們常常看到如下這種情況:

int sum(int a,int b)
{
    return a+b;
} 

引數框裡面不止一個引數,此時我們將引入多元函式來解釋此現象:

在這裡插入圖片描述
而從中此例子可以看出return 後面不僅可以跟變數還可以跟表示式,擴充套件一下return 後面可以跟常量,常用的比如1,0,-1,也可以是巨集定義的常量。
同時我們也知道,並不是所有函式都需要return,那麼不用return的這些函式的函式型別又是什麼呢?我們知道函式的型別取決於返回值的型別,這些沒有返回值的函式就沒有型別,但是沒有型別我們也取個型別名字叫做無型別(void)。
函式的型別有多重要,我們下面執行一個較複雜的程式碼,通過例項來看看。
在這裡插入圖片描述
附上此題的一段程式碼:

#include<stdio.h>
#include<math.h>
#define pai 3.1415926
int chord(float h) //求半弦長的函式 { float a; a= sqrt(2*h - h * h); return a; } float area(float h,float k) //求面積函式 { float t1,t2; for(int t=1;t<6;t++) { for(int i=0;i<10;i++) { t1=acos(1-h)-(sqrt(2*h-h*h))*fabs(1-h); t2=k*pai/(1+k); if(t1<t2) h=h+pow(0.1,t); if(t1==t2) h=h; if(t1>t2) h=h-pow(0.1,t); } } return h; } int main() { float h = 1,k, a; float c,n; printf("請輸入比值:"); scanf("%f:%f", &c,&n); k=c/n; if (k <= 1) k = k; else k = 1 / k; h=area(h,k); a =chord(h); //呼叫函式chord() printf("切口弦長為%.4f", 2 * a); }

執行截圖:
在這裡插入圖片描述
我們發現調取chord()函式的時候,在1:2的比值情況下出現了錯誤。首先,我們宣告此函式演算法沒有問題。那麼返回0.0000又是為什麼呢?
我們注意到return 後面跟著的a為float型別,而該函式為int型別。我們知道最後的答案應該為1.9285,這是float型別他並不能以int 的形式傳送過去,而對於2.0000,實踐證明它相當於2的形式能正確傳出。
意味著函式型別和return 的變數型別不同時,返回的結果正確與否還得看天意???
解決辦法就很明顯了,你型別不同產生的問題,我直接改成一樣的嘛。
修改後的程式碼和執行結果截圖如下:

#include<stdio.h>
#include<math.h>
#define pai 3.1415926
float chord(float h)      //求半弦長的函式
{
	float a;
	a= sqrt(2*h - h * h);
	return a;
}
float area(float h,float k)       //求面積函式
{
	float t1,t2;
	for(int t=1;t<6;t++)
	{
		for(int i=0;i<10;i++)
		{
			t1=acos(1-h)-(sqrt(2*h-h*h))*fabs(1-h); 
			t2=k*pai/(1+k);
			if(t1<t2)
				h=h+pow(0.1,t);
			if(t1==t2)
				h=h;
			if(t1>t2)
				h=h-pow(0.1,t);  
		}
	}	  
	return h;
}
int main()
{
	float h = 1,k, a;
	float c,n;
	printf("請輸入比值:");
	scanf("%f:%f", &c,&n);
	k=c/n;
	if (k <= 1)
		k = k;
	else
		k = 1 / k;
	h=area(h,k);
	a =chord(h);                   //呼叫函式chord() 
	printf("切口弦長為%.4f", 2 * a);
}

執行截圖
在這裡插入圖片描述
此時是完全沒有問題的。
那麼來到下一個問題,返回值為陣列的時候怎麼辦?
通過有返回值的C語言的函式數學模型對應著單值多元函式即可得知,返回值只能有一個啊,親。
數組裡面一堆東西,而C語言屬於面向過程程式設計,不能像python等程式語言把類似於C語言陣列的一個叫列表的東西以物件的形式返回。
這個時候就在C語言的精華了,這個東西叫指標。具體學習內容很多,可以參考別的博文。先說結論,數組裡面一堆數,他得放到電腦記憶體裡面啊,放到記憶體裡面就在那個記憶體格里面放的不就有個地址嗎?指標就是記錄這個地址的一個變數,而且神奇的是數組裡面的數都連排住,比如第一個住100,第二個住101這種的。
這時候思路就明朗了,我們只要知道了第一個數的地址,根據這些數連排住,不就可以知道所有的地址了嗎?知道地址我們就可以通過解引用操作(*跟上指標變數名)得到該地址下的變數的值。
所以了我們只需要返回陣列第一個數的地址便可以知道整個陣列的內容了。
而此時的問題,如何返回首地址呢?
還好C語言幹了件人事,陣列名就是個指標,而且還恰巧指在了我們所謂的第一個數的地址,即首地址。結合上面所說,返回變數型別要和函式型別有所對應。陣列名為指標,則函式為指標型別。是什麼指標型別取決於陣列是什麼型別的陣列。

#include <stdio.h>
int main( )

{

     printf( "Hello World!" );

     return 0;
}

下面回到最初的問題,hello world中為什麼會有個return 0,因為main函式也是函式,觀察下這段程式碼:main的型別,int型別。我們所知沒有返回值的函式是不是應該為void型別,也就是說你寫void main()或者 main()不寫return0在邏輯上是一點問題也沒有,但是他為int 型別你是不是得給他個返回值?那麼為什麼要return 0 呢?
main函式的返回值為0表示執行完整個main函式沒有問題,成功返回。
要知道main()和其他函式可不同,最終所有的呼叫不都是在這裡完成的嗎?
那為什麼0代表正常退出呢?
下面需要了解一個函式exit(),字面意思一個表示退出的函式,然後重點來了exit()的傳入引數分為0和非0兩種狀態。exit(0)表示程式正常退出,exit(1)(1可以為其他的非零數字)為非正常退出。

寫作不易,如果對你有幫助的話,請留下你的評論和贊吧!