0

为什么此代码打印 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

4 回答 4

10

因为 x 真的是 argc (你的参数计数是 1)

main 的签名是:

int main (int argc, char **argv)

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

于 2013-02-26T16:57:49.927 回答
1

更新

如果我们查看C++ 草案标准部分Main function2段,您的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 是一个字符串数组,它代表程序的参数,第一个是命令行。

于 2013-02-26T16:58:01.307 回答
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从程序内部调用而变得棘手:这是不允许的。

于 2013-02-26T18:14:40.450 回答
-1

因为操作系统需要这个签名main

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

argc是参数的数量。当它调用 yourmain时,它将参数的数量 ( argc) 作为第一个参数传递,即 1(如果你调用不带参数的二进制文件,你仍然会得到一个参数:二进制文件名,$0以 bash 表示)。

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

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

于 2013-02-26T16:59:11.277 回答