2016-09-06 234 views
-1
#include<stdio.h> 
#define N 100 

int main(int num, char *argv[]) 
{ 
    while(num <= N && printf("%d\t", num) && num++) 
    {} 
} 

試圖打印1到N而不使用分號。 想出了這個解決方案(下面),但迭代方法(上面)正在發生什麼。什麼是字符指針在做什麼? 在上面的代碼中,即使刪除指針參數,代碼也能正常工作。 在網站上找到了上述解決方案。什麼是指針聲明?

#include <stdio.h> 
#define N 100 

int main(num) 
{ 
    if(num <= N && printf("%d\t", num) && main(num = num + 1)) 
    {} 
} 
+0

它包含傳入的命令行參數。如果您使用參數運行程序,那麼'num'將會隨參數數量的傳遞而開始。 – matt

+0

即使指定了類型('int num'),'int main(num)'也是無效的。 'main'簽名是'int main(void)'或'int main(int argc,char * argv [])' –

+0

http://stackoverflow.com/questions/2108192/what-are-the-valid-signatures -for-cs-main-function –

回答

1

當你有

int main(num) 
{ 
... 
} 

int類型的num默認值。但是這不再有效,因爲隱式int規則自C99以來已經被刪除。所以你的程序在多個方面不符合標準。但它可能適用於大多數編譯器,因爲舊規則仍舊適用於舊代碼(C89及更早版本)。但決不是靠這個。

GCC(gcc -Wall -Wextra -std=c11 -pedantic test.c)與警告說:

warning: type of ‘num’ defaults to ‘int’ [enabled by default] 

的另一個問題是,main()的簽名是無效要麼。這不是C標準所需的簽名之一:

C11,5.1.2.2.1計劃啓動(N1548草案):

稱爲在程序啓動的功能被命名爲主力。 實現聲明此函數沒有原型。它應是 德音響帶有int,返回類型和不帶參數的定義:

INT主要(無效){/ * ... * /}

或兩個參數(這裏稱爲argc和argv雖然可以使用任何 名,因爲它們是本地的,其中它們是 聲明的功能):

INT主(INT的argc,炭的argv []){/ ... * /}

或同等產品; 10)或在某些其他實施中定義的m anner。

+0

我想補充一點,你應該*總是*編譯時激活警告標誌('-Wall -Wextra'),如果你有一個傾向於忽略它們,一個'-Werror'也會有好處 – sokkyoku

0

main()函數接收在啓動程序時傳遞給它的參數數量和參數,以便您可以訪問它。

num包含參數的數量,argv包含指向參數的指針。 argv [num]總是一個NULL指針。參數通常包括程序名稱本身。

0

標準main()的聲明是:

int main(int argc, char *argv[]) or 
int main(void) 

主,從操作系統調用時,基本上被傳遞的參數的數目(一個int)和字符串的對應於所述陣列的計數命令行參數。你不使用字符串;不大。

你已經做了什麼是混蛋主要一點;大多數(如果不是全部的話 - 不確定)平臺對於main()在聲明時擁有的參數少於兩個的情況相當不錯(儘管所有東西都會在堆棧中傳遞 - 您的程序只是沒有一種好的方法來訪問他們)。你已經對main()的調用進行了遞歸遞歸,通過以一種很時髦的方式聲明它,你將會遠離它。另外,當你沒有指定一個類型時,C假定爲int,這也是你爲什麼要這樣做的原因(第一個var默認是一個int)。大多數編譯器至少會對此提出警告。

請注意,如果你運行的程序爲:

./foo bar baz bingo ... (a bunch more) 

您的計數將在> 1日開始,等

這是一個有趣的黑客,但不要寫這樣的代碼:-)