小古銀的官方**(完整教程):
補充知識
既然用過std::abs()
函式,那麼,現在就以它為例,實現乙個myabs()
函式來實現求絕對值。
返回值型別 函式名稱(引數型別 引數名稱, 引數型別 引數名稱)
根據這個格式實現myabs()
函式:
#include int myabs(int num)
else
return value;
}int main(void)
輸出結果:
1024
2333
6666
先看一下呼叫myabs()
的時候跟呼叫std::abs()
函式時是一樣的。
然後再看看定義:
int myabs(int num)
else
return value;
}
myabs
是函式的名稱,myabs
前面是返回值的型別,後面括號內是函式的引數,num
是需要轉成絕對值的值,它只接受int
型別,所以呼叫就可以這樣:
int absnum = myabs(-100);
上面**中,函式引數num
叫做形式引數;而傳進去的引數-100
叫做實際引數。
形式引數實際上是乙個區域性變數,它的作用域就是在myabs()
函式內。假設傳入乙個數值,上面**函式的形式引數的行為是:int num = 100;
,然後執行函式內的**;假設傳入乙個變數value
,那麼形式引數的行為就是:int num = value;
。也就是說,當有引數傳入函式時,傳入引數的行為就是乙個賦值行為。所以,如果乙個引數占用記憶體比較大,那就會導致大量資料被複製。
以下**判斷,如果num
小於0就給它乙個負號讓它變成正數,然後再賦值給value
;如果num
非負則直接賦值給value
:
int value = 0;
if (num < 0)
else
然後,myabs()
函式返回計算結果,也就是變數value
:
return value;
當然啦,為了方便分析我做了一些拆分,實際上,myabs()
函式可以簡寫成這樣:
int myabs(int num)
else
}
因為newnum
是int
型別,所以返回值我就決定是int
型別了。如果你覺得返回值肯定是非負的,那麼你也是對的。所以,myabs()
函式也可以寫成這樣:
unsigned int myabs(int num)
else
}
再放乙個含有多個引數的函式的栗子:
#include int add(int a, int b)
int main(void)
在c++11前,為了減少函式返回值的額外開銷,一般將非基本資料型別的型別(例如std::string
)通過引數來返回。c++11開始,返回值直接返回不會帶來額外的開銷。因為返回變數時,編譯器並不會銷毀區域性變數的記憶體而且還會將記憶體位址直接傳遞給儲存返回值的變數。由於這個轉變,使c++設計出來的函式更加直觀地表達出其意義。而這個機制就叫做完美**。 C 入門教程(12) 定義函式
小古銀的官方 完整教程 既然用過std abs 函式,那麼,現在就以它為例,實現乙個myabs 函式來實現求絕對值。返回值型別 函式名稱 引數型別 引數名稱,引數型別 引數名稱 根據這個格式實現myabs 函式 include int myabs int num else return value ...
C 入門教程(五十二) 靜態陣列
小古銀的官方 完整教程 多維陣列 靜態陣列就是使用棧記憶體的陣列,一般簡稱陣列。以下是陣列的建立和簡單使用 include std cout std endl int main void 跟上面一樣,賦值符號可省略 int arr2 10 建立具有10個元素的陣列,前三個分別初始化為1,2,3,剩餘...
C 入門教程4 定義變數
有int型 long型 long long型 short型等等。下面是每個整型表示能的數的大小 整型名表示數的大小 short 32768 32767 int 2147483648 2147483647 long 同int型一樣 long long 9223372036854775808 92233...