#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 :(得分: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等开始
这是一个有趣的黑客,但不要写这样的代码: - )