C++ Main()接受表达式吗?
为什么此代码打印1而不是5 代码: 使用的编译器:mingw3.2 编辑 我的观点是天气是否执行。如果没有,那么为什么我没有收到任何错误或警告 因为x实际上是argc(并且您的参数计数为1) main的签名是:C++ Main()接受表达式吗?,c++,main,C++,Main,为什么此代码打印1而不是5 代码: 使用的编译器:mingw3.2 编辑 我的观点是天气是否执行。如果没有,那么为什么我没有收到任何错误或警告 因为x实际上是argc(并且您的参数计数为1) main的签名是: int main (int argc, char **argv) argc是参数计数 argv是这些参数的数组更新 您的main声明无效,如果我们查看3.6.1主要功能第2段(强调部分): 实现不应预定义主要功能。此功能不应过载其返回类型应为int,否则其类型由实现定义所有实施都应允许
int main (int argc, char **argv)
argc是参数计数argv是这些参数的数组
更新 您的
main
声明无效,如果我们查看3.6.1
主要功能第2段(强调部分):
实现不应预定义主要功能。此功能不应过载其返回类型应为int,否则其类型由实现定义所有实施都应允许这两种情况
-函数()返回int和
-返回int的函数(int,指向char的指针)
因此,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
,因为这是您的操作系统预期和使用的。为要编程的任何对象创建另一个函数。在void f(int x=5)
中,=5
部分是默认参数。您可以通过两种不同的方式调用该函数:
f(); // uses default argument, as if f(5)
f(3); // explicit argument
请注意,使用默认参数的决定是在调用的点作出的,而不是在声明点作出的。无论
intmain(intx=5,char*argv[])
是否有效,应用程序的启动代码(编译器库的一部分)都不会知道尝试的默认参数,因此不会对其执行任何操作。不要试图通过从程序内部调用main
来耍花招:这是不允许的。那么如何打印5。(如果可能的话)除了程序名之外,还要提供4个命令行参数progname一二三四
将打印5。另外,修改您的函数以正确实现main()@Arpit:要么用足够的参数调用程序,要么<代码>printf(“%d”,5)代码>?@DavidRodríguez dribeas我知道我可以这样做:)。所以我的观点是表达式x=5
是否被执行。@arbit当然不是。您正在使argc
具有一个默认值(即5
),但argc
始终传递给main
。你的5
永远不会被使用。哦,天哪。。。您真的应该使用main
的一个标准定义,其中没有一个使用单个int
,没有一个具有默认值……注意:这是一个非法的main声明。@我这样做只是为了检查weather main execute expressions与否。@arbit:这不是一种有效的检查方法。此外,什么例外?默认参数值是C++,而不是C。有多个有效的main
签名。所有C++实现必须支持main
时,如果您的签名指定了任何变量,那么您的参数变量中就包含了数据。这就是为什么如果二进制文件以参数计数1开始,那么x
会得到1。@Albert:程序的真正入口点不是main
。在到达main
之前会发生很多事情。例如,初始化具有静态存储持续时间的对象。操作系统的入口点指向执行所有这些预主操作的代码。完成后,调用main
。对main
函数的真正调用是从编译器代码内部触发的,而不是从操作系统触发的。
f(); // uses default argument, as if f(5)
f(3); // explicit argument