`int main(i){ printf("i = %d\n", i); }`我的价值是1.为什么?请解释?

`int main(i){ printf("i = %d\n", i); }` i value is 1. why ? please explain?

为什么打印 I 值为 1,有人可以解释一下吗?

#include<stdio.h>
int main(i)
{ 
    printf("i = %d\n", i); 
}

输出 i = 1。

Ci 解释为类型 int - if you don't declare a variable, its default type is int. By coincidence, main is used to being called as int main(int argc, char **argv), so your i (which is now an int) fits into that first parameter. main will allow you to call it with only one argument, but this is technically undefined behavior - 不要这样做。

第一个值 argc 是一个数字,详细说明给出了多少个命令行参数。 (第二个是这些参数的字符串。)在你的例子中,只给出了一个命令行参数,即可执行文件的名称(可能是 ./a.out)。

使用 ./a.out some strings here 尝试 运行 您的代码 - 您会注意到打印的值不同。

这里有两三个不同的小谜团。不确定你想知道哪一个,所以我想我会回答所有三个问题。

  • 你是如何在没有 i 类型的情况下声明 int main(i) 的?

  • 您如何声明 main 接受一个参数,而不是常规的两个参数?

  • 你运行时值1是从哪里来的?

答案:

(1) 很久很久以前,在 C 的黎明(或至少是早晨),函数定义语法是不同的。你没说

int main(int argc, char *argv[])
{
    ...
}

相反,你说

int main(argc, argv)
int argc;
char *argv[];
{
    ...
}

那时 "implicit int" 也风靡一时。所以如果你只是写

int main(argc, argv)
char *argv[];
{
    ...
}

编译器说 "Okay, there's a parameter argv and it's a char **, and there's a parameter argc and it's a... oh, you didn't say, so I'll just quietly assume int."

而且由于 C 在向后兼容性方面一直非常重要,许多编译器今天仍在接受旧语法,尽管它已经正式废弃了一段时间。

(2) 此外,在您的情况下,您完全放弃了 argv 部分。 main 应该有两个参数,这是系统在程序启动时调用它的方式,但你只声明它接受一个。那为什么它起作用了?

严格来说,当使用与预期不同数量的参数调用函数时,行为是未定义的,但这是您经常可以逃脱的事情,尤其是在传递的参数多于预期的情况下预期的。因此,尽管系统传递了第二个 argv 您的程序没有预料到的参数,但额外的参数只是被悄悄丢弃了。

(3) 那么,1是从哪里来的呢?好吧,这是由于 main 的常规 argcargv 参数的实际含义。 C 的 main 定义基于命令行调用。通常人们会输入类似

的东西
programname somefilename someotherargument

然后点击RETURN。这会调用一个名为 programname 的程序,带有两个命令行参数 somefilenamesomeotherargument。那么这些是如何传递给 main 的呢?

嗯,argc 是对它们的数量的计数,argv 是参数字符串本身的数组(v 代表 "vector")。并且参数列表总是包含程序名称本身。所以如果你调用

programname somefilename someotherargument

然后 argc 作为 3 出现,argv 作为数组出现

{ "programname", "somefilename", "someotherargument", NULL }

但是,如果您不带任何参数调用某些内容,那么 argc 仍然会以 1 的形式出现。所以这就是您看到的 1 的来源。