为什么此代码打印 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 是这些参数的数组
更新
如果我们查看C++ 草案标准部分Main function第2段,您的main
声明无效(强调我的):3.6.1
实现不应预定义主要功能。该功能不得重载。它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。所有实现都应允许
— () 的函数返回 int 和
— (int, pointer to pointer to char) 返回 int 的函数
所以main
应该遵守编译器文档定义的这些标准形式或实现定义的形式之一。
gcc
不管警告级别如何,都会给我一个警告,clang
这是一个错误,所以我不确定为什么你没有看到错误。
原始答案
main 的第一个参数是参数计数,通常表示为 argc,例如:
int main(int argc, char *argv[])
{
}
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
:
int main(int argc, char** argv);
argc
是参数的数量。当它调用 yourmain
时,它将参数的数量 ( argc
) 作为第一个参数传递,即 1(如果你调用不带参数的二进制文件,你仍然会得到一个参数:二进制文件名,$0
以 bash 表示)。
请注意,这也取决于 C ABI。main
根据 C/C++ 标准,允许多重签名。因此,根据编译器和操作系统的不同,对main
. 你所做的并不是真正定义的行为。
您应该main
像预期的那样声明 - 因为这是您的操作系统所期望和使用的。为您想要编程的任何内容创建另一个功能。