为什么此代码打印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
是否执行。如果没有那么为什么我没有得到任何错误或警告。
答案 0 :(得分:10)
因为x实际上是argc(并且你的参数计数是1)
main的签名是:
int main (int argc, char **argv)
argc是一个参数计数
和argv是这些参数的数组
答案 1 :(得分:1)
更新
main
声明无效,如果我们查看C++ draft standard部分3.6.1
主要功能段 2 说( 强调我的):
实现不应预定义主函数。此功能不应过载。 它的返回类型为int ,但其类型是实现定义的。 所有实施都应允许
- ()返回int和
的函数- 返回int
的函数(int,指向char的指针)
因此main
应遵循这些标准表单之一或由编译器文档定义的实现定义表单。
gcc
都会向我发出警告,clang
这是一个错误,所以我不确定为什么你没有看到错误。
原始答案
main的第一个参数是参数计数,通常表示为argc,例如:
int main(int argc, char *argv[])
{
}
和argv是一个字符串数组,表示程序的参数,第一个是命令行。
答案 2 :(得分:1)
在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
来变得棘手:这是不允许的。
答案 3 :(得分:-1)
因为操作系统需要main
的签名:
int main(int argc, char** argv);
argc
是参数的数量。当它调用你的main
时,它会传递参数的数量(argc
)作为第一个参数,即1(如果你不带参数调用你的二进制文件,你仍会得到一个参数:二进制文件名, bash中的$0
。
请注意,这也取决于C ABI。根据C / C ++标准,允许main
的多个签名。因此,根据编译器和操作系统,main
可能会有不同的处理方式。你在做什么并不是真正定义的行为。
您应该像预期的那样声明main
- 因为这是您的操作系统所期望和使用的。为你想要编程的任何东西创建另一个函数。