2016-09-06 138 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日开始,等

这是一个有趣的黑客,但不要写这样的代码:-)