【发布时间】:2015-09-23 06:07:34
【问题描述】:
void main(i)
{
printf("%d",i);
}
这里的main(i) 是什么意思以及它是如何工作的? i 的值和类型是什么?
【问题讨论】:
-
使用签名
int main... -
当我用 gcc 编译器尝试它时,它给出 1 作为输出
void main(i)
{
printf("%d",i);
}
这里的main(i) 是什么意思以及它是如何工作的? i 的值和类型是什么?
【问题讨论】:
int main...
void main(i)
声明一个没有类型的函数参数仅在旧的、过时的 C90 标准中有效。在 C90 中,i 将默认输入 int。
如果此代码用于独立实现(嵌入式系统或操作系统),则它在 C90 中是有效的。它相当于void main (int i)。您的编译器需要记录这种形式的 main() 应该做什么。
如果此代码用于托管实现(在操作系统上运行的编程),则它无效并且不会编译。 C90 2.1.2.2 托管环境只允许两种形式的 main():
int main(void)
int main(int argc, char *argv[])
在较新的 C 标准中,无论是独立的还是托管的,代码都将无效,因为“默认为 int”规则已从语言中删除。
【讨论】:
可能类型为int,表示命令行传递的参数个数;包括程序的名称。
但您不应该像这样编写 main 原型,因为正式的程序行为是实现定义的,因此可能因平台而异。
请改用int main(void) 或int main(int argc, char **argv)。
【讨论】:
首先,
void main(i)
{
printf("%d",i);
}
是C 中的无效 语法,你不应该使用它,因为C 标准说
案例 1:[C11, §5.1.2.2.1 ],在托管环境中,
main() 应该返回 int
void) 或 2 (int argc, char*argv[] 或等效) 参数。案例 2:在独立的环境中,
C 标准不再支持“变量类型默认为int”的概念。[这只是为了理解,标准中不再支持,因此不能保证行为。]
现在,来到上述代码的含义部分,在main()中提供i的定义是一种hacky and obsolete方式,主要是code golfing 中使用以缩短代码大小。 i 的类型在此处默认为 int,并保存提供给程序的扩充数量(包括程序名称)。
因此,例如,如果程序像这样运行
./test
在程序中,i 的值最有可能为1。
【讨论】:
main() 本身不需要命名为main(),不是吗?