天天看點

4.1 自定義函數和結構體

注意本随筆以及以後相關的随筆都是算法競賽入門經典的筆記,是以會有部分内容直接從原文摘入,如有不合理的地方,請聯系FlnButFly,我會馬上删除

1.C語言中的數學函數可以定義成“傳回類型 函數名(參數清單){函數體}”,其中函數體的最後一條語句應該是“return 表達式;”

eg:

<code>int add(int a, int b)</code>

<code>{</code>

<code>return a + b;</code>

<code>}</code>

如果自己定義的函數沒有傳回值,那麼傳回類型需要填為void,并且可以不需要使用ruturn語句,除非希望在某些地方退出函數

2.函數的參數和傳回值最好是“一等公民”,如int或者double,也可以是char,其他的非一等公民作為參數和傳回值要複雜一些,這裡的return是一個動作,不是描述m3.如果在函數的運作過程中碰到了return語句,将直接退出這個函數,不去執行後面的語句,如果在執行的過程中始終沒有return語句,則會傳回一不确定的值,也就是說無論你有沒有寫下return語句,系統都會強制性傳回相應資料類型的值,隻不過我們如果沒有寫return的話,可能會使系統誤判程式是否正常退出,-Wall可以捕捉到這一可疑情況并産生警告。

4.main函數是整個程式的入口,main函數的傳回值0代表正常結束,其他的代表有些異常的退出了,注意在算法競賽中,總是讓main函數傳回0

5.在自定義函數中,不要求函數一步得到結果,其中的代碼規則等同于在main函數中寫的一樣

6.hypot函數實在math.h頭檔案中,同時該數學函數等價于sqrt(aa + bb);

7.

<code>double f(int x1, int y1, int x2, int y2)</code>

<code>int d1 = x1 - x2;</code>

<code>int d2 = y1 - y2;</code>

<code>return hypot(d1, d2);</code>

上述例子說明了一個函數裡面可以調用其他函數,也就是自定義函數其實可以類比于一個新的main函數,在自定義函數中寫代碼和在main函數中寫代碼并沒有什麼差別

8.在C語言中,定義結構體的方法為"struct 結構體名稱{域定義};",注意花括号後面還有一個分号,注意和自定義函數結構的區分

9.注意如果是通過struct定義出來的結構體定義相應資料類型的變量的時候一定要struct 結構體名稱 變量名才可以使用,如果缺少了struct,好像在c++中編譯并不會報錯,可能在c語言中使用會報錯發,對于c來說struct 結構體名稱才是一個新的資料類型,是以在c語言中我們經常使用typedef struct來定義結構體,但是由于C++中struct也擁有了使用typestruct的便捷,是以也比較少用

10.為了使用友善,往往用typedef struct{域定義;}類型名;的方式定義一個新類型名,筆者試過在c++中編譯typedef如果類型名在struct後面仍然能夠通過編譯,但是會報錯,說typedef在申明中被忽視了,而按照上述的文法規則才能正常編譯,當然使用了typedef struct就可以直接定義結構體變量而不用在前面再加上struct了

繼續閱讀