Main()接受表达式吗?

Does Main() accept expression?

本文关键字:表达式 Main      更新时间:2023-10-16

为什么这段代码输出1而不是5

代码:

main(int x=5) //this defn. is written intentionally to chec weather main accepts 
                expression or not. 
{
 printf("%d",x);  
}

使用的编译器:minGW 3.2

编辑

我的观点是x=5是否执行。如果不是,为什么我没有得到任何错误或警告。

因为x实际上是argc(你的参数计数是1)

main的签名是:

int main (int argc, char **argv)

, argc是参数的计数
argv是这些参数的数组

void f(int x = 5)中,= 5部分为默认参数。您可以用两种不同的方式调用该函数:

f();  // uses default argument, as if f(5)
f(3); // explicit argument
请注意,使用默认实参的决定是在调用的点做出的,而不是在声明点。不管int main(int x = 5, char *argv[])是否有效,应用程序的启动代码(编译器库的一部分)都不会知道尝试的默认参数,因此不会对它做任何事情。不要在程序内部调用main,这是不允许的。

更新

你的main声明是无效的,如果我们看一下c++草案标准部分3.6.1 Main function段落2说(强调我的):

实现不能预先定义main函数。此函数不得重载。返回类型为int,否则它的类型是实现定义的。所有实现都允许

—返回int和

的函数

—函数(int,指向char的指针)返回int

所以main应该坚持这些标准形式之一,或者实现定义的形式,由编译器文档定义。

gcc给了我一个警告,无论警告级别如何,在clang中这是一个错误,所以我不确定为什么你没有看到错误。

答案

main的第一个参数是参数计数,通常表示为argc,例如:

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

和argv是一个字符串数组,它表示程序的参数,第一个是命令行。

因为操作系统期望main的签名:

int main(int argc, char** argv);

argc为参数个数。当它调用你的main时,它传递参数的数量(argc)作为第一个参数,它是1(如果你调用你的二进制文件没有参数,你仍然得到一个参数:二进制文件名,在bash中$0)。

注意,这也取决于C ABI。C/c++标准允许main的多重签名。因此,根据编译器和操作系统的不同,main可能会有不同的处理。你所做的并不是真正定义的行为。

你应该像预期的那样声明main——因为这是你的操作系统期望和使用的。为您想要编程的任何内容创建另一个函数