我经常看到void main()论坛周围的臭名昭着,几乎立即发出评论,告诉用户永远不要使用void main()(我完全同意).但它的起源在void main()哪里?
为什么我仍然看到较新的人养成了main在正确的方式返回时没有任何回报的坏习惯int.我理解为什么这个方法是错误的,正如这个问题和众多其他人所解释的那样,但我不知道这种宣告方法main是如何产生的,甚至不是为什么它仍然教给一些学生.
作为一个低级程序员,我经常使用可执行文件的模块启动代码,所以我很清楚像"crt0"这样的代码是如何工作的.当编写C++代码,我通常声明main为extern "C"以匹配C启动代码会做打电话main.因此我通常使用此声明main(wmain如果专门针对Windows):
extern "C" int main(int argv, const char *const *argv)
extern "C" int __cdecl wmain(int argv, const wchar_t *const *argv)
Run Code Online (Sandbox Code Playgroud)
它是合法使用extern "C"的main?此外,const char *const *argv的类型是合法的,而不是char *[]?
我写了一个打印表格的程序.我没有在main函数中包含返回语法,但每当我输入echo $时仍然如此?它显示12.
我的源代码:
#include <stdio.h>
int main(void)
{
int ans,i,n;
printf("enter the no. : ");
scanf("%d",&n);
for(i=1;i<=10;i++)
{
ans = n*i;
printf("%d * %d = %d\n",n,i,ans);
}
}
Run Code Online (Sandbox Code Playgroud)
我没有写回12,但每次执行程序时它仍返回12.
谢谢.
为什么main()用户定义了功能?
我什么时候会使用void main()和int main()?
在C89/C99/C11中,在独立环境中,入口点功能是实现定义的.在托管环境中,它必须int main符合严格的程序.大多数现代编译器都会void main出错.但是,我看到很多用户使用void main.即使在不合格的编译器中允许它,为什么要使用它?我认为没有任何实际理由void main可以优先考虑int main.即使在C89中,它也是未定义的行为return.
是否有人气的历史原因void main?
我不相信我的问题主要是基于意见的.一些有效的想法已经在这个帖子中提出过,例如微软的void main扩展,以及Window的受欢迎程度,以及它是C书重印不正确信息的结果.这些是客观和历史原因.
考虑以下基本示例:
#include <stdio.h>
int main(void)
{
printf("Hi there!\n");
}
Run Code Online (Sandbox Code Playgroud)
它是否在C89中调用未定义的行为?我试图从这个问题中得到一些意义,但是大多数赞成的答案声称它是实现定义的,绝对没有UB(与Keith Thompson的评论,看起来相互矛盾).
规范在§3.16 定义和惯例中说明:
如果违反约束之外出现的"应"或"不应"要求.行为未定义.未定义的行为在本国际标准中以"未定义的行为" 或省略任何明确的行为定义来表示.这三者之间的重点没有区别:它们都描述了"未定义的行为".
和§5.1.2.2.3 程序终止:
从初始调用到
main函数的返回等效于使用exit函数返回的值main作为其参数调用函数.如果main函数执行不指定值的返回,则返回到主机环境的终止状态是未定义的.
我的理解是,后面的子条款不包括丢失返回的情况,因为return声明从未被调用过,因此以前的子条款适用.
然而futher读数表明不同的东西,§6.6.6.4 的return声明:
如果执行了
return没有表达式的语句,并且调用者使用了函数调用的值,则行为是未定义的. 到达}那个终止函数等同于执行return没有表达式的 语句.
好的,所以现在的5.1.2.2.3子条款适用:
如果
main函数执行不指定值的返回.返回到主机环境的终止状态是未定义的.
术语"终止状态未定义"似乎不是UB,也不是任何特定行为,但更像是在C标准范围之外,更像是:"让主机环境变得烦恼,我们洗手这里".这是正确的解释吗?
main()C程序中的函数可以返回double数据类型吗?
如果是,如何以及为何?
如果不是,为什么?
情况1:
void hello(void) {
//something
}
int main()
{
hello(1); //error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
案例2:
int main(void) {
//something
return 0;
}
Run Code Online (Sandbox Code Playgroud)
执行:
./a.out something something //No error, Why?
Run Code Online (Sandbox Code Playgroud)
为什么没有错误?main将无法采取任何论点.那么为什么可以从命令行提供参数呢?
我唯一接触过编程的是Java,在那里我没有遇到(到现在为止)编写main方法的不同惯例.我一直在学习c(K&R和C编程现代方法)的来源,他们使用的非常不同形式的主要方法(功能).
K&R版本到现在为止:
main() {
blah blah blah;
}
Run Code Online (Sandbox Code Playgroud)
C编程现代方法
int main() {
blah blah blah;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
要么
int main() {
blah blah blah;
//returns nothing
}
Run Code Online (Sandbox Code Playgroud)
为了让事情更加混乱,我见过人们这样做:
int main(void) {
blah blah blah;
}
Run Code Online (Sandbox Code Playgroud)
虽然他们要么返回0,要么没有.我没有在我没有受过教育的假设中认为这只是一个标准问题,但可能更具概念性或更深层次.有人能解释一下这个问题吗?
我是C语言的初学者.任何人都可以使用示例详细解释main(),int main(),void main(),main(void),void main(void),int main(void)如何在C语言中工作?正如在我们使用void main()时所发生的事情以及当我在简单语言中使用int main()时发生的事情等等.
我知道,但无法理解它在做什么:
当我使用int main()返回0编写简单的hello world时,它仍然给出与使用void main()时相同的输出,那么它是如何工作的?它的应用是什么?