为什么这段代码输出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
——因为这是你的操作系统期望和使用的。为您想要编程的任何内容创建另一个函数