1. 程式人生 > >C語言編程漫談——main函數

C語言編程漫談——main函數

put 什麽 除了 遇到 寫法 技術 cal cut rdquo

寫在前面

促使我寫這篇文章是因為我這幾天找了幾個一樣是大三的同學,與我相同專業相同方向(物聯網)的人,除了@小胡同的詩,基本沒有什麽其他人會現在看起來很簡單的編程題目了。問了一下其他同學,他們大部分都說自己C語言是混過的,因為之前老師教的時候說不會指針||結構體||函數 不會寫也沒有關系,然後他們居然還能過省二級(C語言)???結果到了大三,沒人給他們做大腿了,所以基本上課堂上就進入了“休眠模式”,後面的東西基本都聽不懂了……所以來這裏給大一大二還在學習C語言的同學一點小小的建議。這樣才能編的下去代碼。

Main函數

總所周知,所有C語言程序基本上都有個Main函數,哪怕是操作系統的代碼也逃不過這個Main函數,如果沒有Main函數最直接的後果是編譯器不知道剛開始的代碼在哪裏,於是規定使用main函數作為整個程序的入口,一般來說,在完成初始化操作之後放入運行程序棧底位置,有Main函數內部的調用來決定以何種順序來使用匯編好的各種函數位置。

在《C語言程序設計》廈門大學版(也就是福建省版)

中一個典型的Main函數長成這樣子

1 int main() //Main函數返回一個整形變量來表明自己運行情況,默認無參數
2 {
3     //函數體 隨便寫點什麽...
4     return 0; //需要返回值,以便給操作系統留下遺言
5 }

我們看出在這個函數裏面,參數部分沒有任何參數,因為一般的程序不需要使用什麽參數直接就能運行了,一個典型的Hello world裏面直接就寫printf("Hello world\n");就完事了,也沒有什麽特別的變換。

為什麽要有返回值,如果這段代碼不是計算機運行的第一個程序(也就是操作系統),那麽就需要一個返回值,讓操作系統知道這個程序到底運行的怎麽樣?是好還是壞,由於某種原因,我們這裏采用0作為沒有錯的返回值。

最可能原因的是0相當於false,操作系統問程序:嘿,程序,你運行的怎麽樣? 程序:沒問題(0,false),操作系統就知道程序沒有運行錯就不用去管他了,如果程序運行的好好,突然由於一些意外的事情導致沒有退出,操作系統就能知道程序到底出了什麽錯。

但是main函數往往不是這個樣子,你可能還講過下面的Main函數形式

譚浩強/MSDN/C51 典型的main函數

void main() //不需要返回值,所以類型為void 空
{
  //函數體  
}

說起來譚浩強也可能被上古的MSDN的示例坑了,才在自己的C語言書裏面寫void main()的,MSDN裏面的示例真的充滿了Void Main

// CalculatorTutorial.cpp : This file contains the ‘main‘ function. Program execution begins and ends there.
//

#include "pch.h"
#include <iostream>

void main() //現在是int main()
{
    std::cout << "Hello World!\n"; 
}

// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu

// Tips for Getting Started: 
//   1. Use the Solution Explorer window to add/manage files
//   2. Use the Team Explorer window to connect to source control
//   3. Use the Output window to see build output and other messages
//   4. Use the Error List window to view errors
//   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
//   6. In the future, to open this project again, go to File > Open > Project and select the .sln file

當然排除錯誤寫法之後,void main還常見於C51的程序,C51是應用在8051系列單片機上的一種C語言的變種,主要的編譯器為Keil,由於C51編寫的程序是直接在裸機(無操作系統)上跑的程序,所以不需要返回值(因為也沒有地方可以理你的返回值),但這個只是來自有著40年歷史老單片機的倔強而已,現在的單片機使用的C語言跑的編譯器一般還是要求使用 int main帶返回值的形式(GCC編譯器會隱式轉換void main為int main帶返回值的形式),當然現代的編譯器還是會幫你補上返回值的

還有一種學校裏面不會教的就是帶有參數的main函數,這種main函數常見於Linux 編程(因為一般Linux操作系統不運行圖形界面,所以如果不帶參數一般無法運行)、

Liunx終端/Windows 控制臺 編程中的main函數

int main(int argc,char **argv)
{
    //函數體
  return 0;  
}

argc指示的是傳入的參數個數,argv為傳入的指令,在Linux中傳入的參數0位置一般為自己的名字例如“ls”,剩下就是可選參數位

一般剛學的同學完全沒有接觸過控制臺編程,所以一旦遇到這種東西就會手足無措。

在Windows中你們經常使用的一個帶有參數的程序,也許就是ping命令(ping 主機名,向遠程主機發送ICMP報文,指示與遠程主機是否能進行通信,在這種情況下“主機名”就是一個參數)

而在linux中經常使用帶有參數的程序就是cat程序(查看文件內容 c)的程序,因此參數此時作為必須要有的東西

在C語言中由於沒有自動維護的string類型的東西,所以只能以原始的字節串(雖然一般都稱為“字符串”,但是考慮到“字符”是有“編碼”的,所以只能稱為“字節串”)數組的形式存放,參數argc實際上就是字節串數組第一維的個數。

下面是一個簡單的使用參數的標準C語言程序:

#include<stdio.h>
#include<string.h>

int main(int argc,char* argv[])
{
    int i=0;
    if(argc<1)
    {
        printf("Usage sample [...] to use this program!\n");
    }else{
        for(i=0;i<argc;i++)
        {
            printf("arg[%d]:%s\n",i,argv[i]);
        }
    } 
    return 0;
}

運行起來看看,如果在Dev C++下直接運行你看的是這樣的界面

技術分享圖片

可以看到他的第一個參數就是自己。

技術分享圖片

可以看到第一個參數永遠都是調用者自己的名字,後面才是輸入的參數,這也是控制臺程序的有用的地方。

在所有具有參數並且要求參數的控制臺程序,使用時必入參數,否則argc會小於1,導致無法執行原來程序編程的功能。

例如linux中的lpcrm [-m] [-q] <編號>,這段程序用於移除在系統共享內存段或者消息隊列,這些內容是屬於《計算機操作系統》的相關內容,如果想要了解的同學可以提前買一本《計算機操作系統》看看,雖然可能看不懂(無奈,似乎操作系統沒有圖說系列)

C語言編程漫談——main函數