`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。
C
将 i
解释为类型 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
的常规 argc
和 argv
参数的实际含义。 C 的 main
定义基于命令行调用。通常人们会输入类似
的东西
programname somefilename someotherargument
然后点击RETURN。这会调用一个名为 programname
的程序,带有两个命令行参数 somefilename
和 someotherargument
。那么这些是如何传递给 main
的呢?
嗯,argc
是对它们的数量的计数,argv
是参数字符串本身的数组(v 代表 "vector")。并且参数列表总是包含程序名称本身。所以如果你调用
programname somefilename someotherargument
然后 argc
作为 3 出现,argv
作为数组出现
{ "programname", "somefilename", "someotherargument", NULL }
但是,如果您不带任何参数调用某些内容,那么 argc
仍然会以 1 的形式出现。所以这就是您看到的 1 的来源。
为什么打印 I 值为 1,有人可以解释一下吗?
#include<stdio.h>
int main(i)
{
printf("i = %d\n", i);
}
输出 i = 1。
C
将 i
解释为类型 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
的常规 argc
和 argv
参数的实际含义。 C 的 main
定义基于命令行调用。通常人们会输入类似
programname somefilename someotherargument
然后点击RETURN。这会调用一个名为 programname
的程序,带有两个命令行参数 somefilename
和 someotherargument
。那么这些是如何传递给 main
的呢?
嗯,argc
是对它们的数量的计数,argv
是参数字符串本身的数组(v 代表 "vector")。并且参数列表总是包含程序名称本身。所以如果你调用
programname somefilename someotherargument
然后 argc
作为 3 出现,argv
作为数组出现
{ "programname", "somefilename", "someotherargument", NULL }
但是,如果您不带任何参数调用某些内容,那么 argc
仍然会以 1 的形式出现。所以这就是您看到的 1 的来源。