C語言的體繫結構–main函數存在的必然性(聽楊力祥老師的課)

來源:互聯網
上載者:User

  註:不是原創,課堂上聽來的,防止遺忘,所以記下來!

  C語言的體繫結構分為兩個部分:資料和函數,當然最終這兩個部分都是要進入到電腦的記憶體中去。

  函數在編譯後編程可執行代碼,存放在代碼區;資料分為幾種:局部與全域,auto和static,簡單的說就是放在待用資料區,堆中和棧中。

  對於全域的變數和靜態變數是在main函數之前建立的。

  C語言有個規定:全域區不能有可執行代碼 ,可執行代碼必須進入函數中。但是C語言中的函數都是全域的,這就導致函數不能嵌套定義:嵌套定義導致函數內部定義的函數成了局部函數。所以要解決各個函數的執行問題只能通過函數的嵌套調用。這時就需要有一個函數首先被執行,來調用其他一系列的函數,完成程式的功能,而這個第一個調用的函數就是main函數。

  以上就是main函數存在的必然性,本人文筆欠佳,解釋不清的地方湊活著看吧。

  但是以上體系在C++中遇到了矛盾。C++的全域對象從C的體繫結構上推是要先於main函數執行的。全域對象要在main函數執行之前建立,而對象的建立要執行建構函式,這樣就導致了建構函式的執行早於main函數。而且用以下代碼調試時確實結果顯示建構函式早於main函數執行。

#include<iostream>

class T

{

  public:T(){cout<<"建構函式"<<endl;}

}

T t;

int main(void)

{

  cout<<"main"<<endl;

  return 0;

}

這就與C語言的體繫結構有衝突了,所以說C++並不是一種純物件導向的程式設計語言。至於怎麼解決這個體系衝突,則由編譯器決定,可能也是先進入main函數,只是進入之後跳轉到建構函式那裡建立類的對象之後再回來執行main函數的代碼。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.