C++ 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,否则其类型由实现定义所有实施都应允许

为什么此代码打印1而不是5

代码:

使用的编译器:mingw3.2

编辑

我的观点是天气是否执行。如果没有,那么为什么我没有收到任何错误或警告

因为x实际上是argc(并且您的参数计数为1)

main的签名是:

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++实现必须支持 int main()和 int main(int,char **),它们可能会选择更多的参数。这个答案试图填补知识上的空白,但并没有完全发挥作用。为什么第一个参数必须是1?@JBentley-我猜阿尔伯特在回答OP(我也猜得分7000+的人并不认为argc总是1)。@DavidRodríguez dribeas:当然。我不太明白你的意思。参数仍然在堆栈上。因此,当操作系统调用
main
时,如果您的签名指定了任何变量,那么您的参数变量中就包含了数据。这就是为什么如果二进制文件以参数计数1开始,那么
x
会得到1。@Albert:程序的真正入口点不是
main
。在到达
main
之前会发生很多事情。例如,初始化具有静态存储持续时间的对象。操作系统的入口点指向执行所有这些预主操作的代码。完成后,调用
main
。对
main
函数的真正调用是从编译器代码内部触发的,而不是从操作系统触发的。
f();  // uses default argument, as if f(5)
f(3); // explicit argument