什么是指针声明?

时间:2016-09-06 08:21:16

标签: c

#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))
  {}
}

3 个答案:

答案 0 :(得分:1)

当你有

int main(num)
{
...
}

num的类型默认为int。但是这已不再有效,因为自C99以来已删除了隐式int规则。因此,您的程序在多个计数上不符合标准。但它可能适用于大多数编译器,因为旧规则仍然适用于旧代码(C89及更早版本)。但绝不是依赖于此。

海湾合作委员会(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草案):

  

程序启动时调用的函数名为main。该   实现声明此函数没有原型。应该是   定义返回类型为int且没有参数:

     

int main(void){/ * ... * /}

     

或有两个参数(这里称为argc和argv,尽管如此)   可以使用名称,因为它们是它们所在的函数的本地名称   声明):

     

int main(int argc,char argv []){/ ... * /}

     

或等同物; 10)或其他一些实施方式。

答案 1 :(得分:0)

main()函数接收启动程序时传递给它的参数数量和参数,以便您可以访问它。

num包含参数的数量,argv包含参数的指针。 argv [num]始终是NULL指针。参数通常包括程序名称本身。

答案 2 :(得分:0)

标准的main()声明是:

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

Main,从操作系统调用时,基本上会传递一个参数个数(一个int)和一个与命令行参数对应的字符串数组。你没有使用琴弦;没什么大不了的。

你所做的就是把主要的东西搞砸了;大多数(如果不是全部 - 不确定)平台是相当不错的,main()在声明时具有比两个更少的参数(尽管一切都将在堆栈中传递 - 你的程序将没有一个好的访问方式他们)。你通过调用main()来递归递归,你通过以一种时髦的方式声明它来逃避它。

另外,当你没有指定一个类型时,C假设是int,这也是你为什么要逃避这个原因(第一个var默认是一个int)。大多数编译器都会至少发出警告。

请注意,如果您将程序运行为:

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

您的点数将从> 1等开始

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