創作內容

0 GP

【寫程式教學】新手篇4-c/c++流程-3

作者:♙♲⚙\~O_O~/⚙♲♙│2017-02-08 14:22:18│巴幣:0│人氣:524
本篇敘述簡單的函式宣告、函式呼叫、scope
不考慮template,overload


說明之前要先了解global和local的區別,簡單來說就是在函式裡面是local,最外面的是global
#include <stdio.h>
// global
int main()
{
    // local
}
// global

函式宣告
與一些程式語言不同,c/c++函式需要宣告在global區
    (好像c++11開始有別的寫法?lambda/closure)
一個函式可以大致可分成以下部分:
  • 額外的head (呼叫上沒問題,且維護不會造成不便的話,可省)
  • 回傳型別
  • 函式名
  • 參數(包含型別及名稱)
  • body (執行這個函式要做的事情, 包含return)
/* 假設: R式回傳型別, N是函式名, Dn是參數型別, dn是參數名稱, C是body */
R N(D1 d1, D2 d2, ...); // head, 注意後面有個分號
R N(D1 d1, D2 d2, ...)
{
    C
}
例如宣告一個將int陣列數值加總的函式:
int sum(int arr[],int length);
int sum(int arr[],int length)
{
    int returnValue=0;
    for(int x=0;x<length;x++) returnValue+=arr[x];
    return returnValue;
}

函式呼叫
比如說在main裡面呼叫剛剛的sum
int main()
{
    int arr[]={1,2,3,4};
    int arrLength=sizeof(arr)/sizeof(arr[0]); // sizeof很好用的
    printf("%d\n",sum(arr,arrLength));
}

scope
意思是說某個變數(或函式)名字是對應哪個區裡面的變數(或函式)
可能這樣說不是很懂,可以看看下方範例
#include <stdio.h>
int a=0;
void setGlobal(int value)
{
    a=value;
    return; // void函式為形態,且為函式的最後一道指令,則可省略
}
int getGlobal(){ return a; }
int main()
{
    printf("%d %d\n", a, getGlobal() );
   // 在main,getGlobal裡面找a這個東西找不到,改找global

    a=1;
    printf("%d %d\n", a, getGlobal() );
    // 在main裡面找a這個東西找不到,改找global,因此 a=1; 是改到global的a

    setGlobal(2);
    printf("%d %d\n", a, getGlobal() );
    // 在setGlobal,getGlobal裡面找a這個東西找不到,改找global,因此 a=value; 改到global的a

    int a=3;
    printf("%d %d\n", a, getGlobal() );
    // 在main裡面找到a,因此在main裡面使用a會得到main裡面的a
    // 在getGlobal裡面找a這個東西找不到,改找global

    a=4; setGlobal(5);
    printf("%d %d\n", a, getGlobal() );
    // 在main裡面找到a,因此在main裡面使用a會得到main裡面的a,因此 a=4; 改到main的a
    // 在setGlobal,getGlobal裡面找a這個東西找不到,改找global
}

以上是不同函式使用相同名稱變數的情況,
那麼同樣的函式在不同層使用相同變數呢?甚麼意思?

遞迴
例如這個印出0到N的函式:(N<0甚麼都沒有)
#include <stdio.h>
void printfZeroToN(int n)
{
    int N=n;
    if(N<0) return;
    printfZeroToN(N-1);
    printf("%d\n",N);
}
每次呼叫printfZeroToN (包含在printfZeroToN裡面呼叫的printfZeroToN) 都會(依照宣告)產生新的local變數(這裡包含N和n),不會改到前一次的


想當初聽遞迴聽不懂,不過我也覺得我這樣講也不是很懂(?)
有錯誤的話趕緊指出,我會盡快修正

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3473199
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:寫程式|教學|新手|C|C++

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

喜歡★agold404 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【寫程式教學】新手篇4-... 後一篇:【寫程式教學】新手篇c/...

追蹤私訊切換新版閱覽

作品資料夾

dhreekingdon幸運看見的你
給你一顆紅心~讓你能保有一整天的好心情~祝你有個愉快的一天喲(<ゝω・)~❤看更多我要大聲說昨天22:59


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】