Main()是否接受表达式?

时间:2013-02-26 16:56:11

标签: c++ main

为什么此代码打印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是否执行。如果没有那么为什么我没有得到任何错误或警告。

4 个答案:

答案 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 - 因为这是您的操作系统所期望和使用的。为你想要编程的任何东西创建另一个函数。