这段C代码的输出是什么(在没有任何命令行参数的情况下运行)?
这段C代码的输出是什么(在没有任何命令行参数的情况下运行) 条件为true,这将导致编译时错误,因为这段C代码的输出是什么(在没有任何命令行参数的情况下运行)?,c,command-line-arguments,argv,argc,C,Command Line Arguments,Argv,Argc,这段C代码的输出是什么(在没有任何命令行参数的情况下运行) 条件为true,这将导致编译时错误,因为 *(argv++),不是吗?但是它显示了一些输出为什么?无耻地引用了C11规范第§5.1.2.2.1章(重点是我的) -argc的值应为非负值 -argv[argc]应为空指针 -如果argc的值大于零,数组成员argv[0]通过 argv[argc-1]应包含指向字符串的指针,这些指针是给定的 程序启动前主机环境定义的实现值。 目的是向程序提供程序启动前确定的信息 来自托管环境中的其他位置。如
*(argv++)
,不是吗?但是它显示了一些输出为什么?无耻地引用了C11
规范第§5.1.2.2.1章(重点是我的)
-argc
的值应为非负值
-argv[argc]
应为空指针
-如果argc
的值大于零,数组成员argv[0]
通过
argv[argc-1]
应包含指向字符串的指针,这些指针是给定的
程序启动前主机环境定义的实现值。
目的是向程序提供程序启动前确定的信息
来自托管环境中的其他位置。如果主机环境无法
为字符串提供大写和小写字母,实现
应确保字符串以小写形式接收
-如果argc
的值大于零,则argv[0]
表示程序名argv[0][0]
如果
程序名在主机环境中不可用如果argc的值为
大于1时,argv[1]
通过argv[argc-1]
表示程序参数。
上面的代码段只是简单地打印提供的程序参数
用于检查我们是否未到达*argv!=NULL
数组的末尾argv
printf(“%s\n”,*(argv++)代码>,让我们把它分解
printf("%s\n", *argv)); //print the string pointed to by `argv` argv++; //increment argv to point to the next string
现在,来谈谈“标题”中的问题 […](在没有任何命令行参数的情况下运行) 那么,在这种情况下,
argc
的值为1
,并且只有argv[0]
持有指向包含程序名的字符串的指针argv[1]
指向NULL
(或类似的NULL指针)
所以,在循环中
- 第一个条件检查是成功(
=*argv
,不为空),它打印程序名argv[0]
作为后期增量的副作用而增加argv
- 第二次迭代,
与现在的*argv
相同,它为NULL,条件为false,并命中最后的argv[1]
语句return
正文中的问题 这应该会给出编译时错误,因为
*(argv++)
,不是吗
不,不是。引用第§6.7.6.3章
将参数声明为“类型数组”应调整为“指向
类型“”,其中类型限定符(如果有)是在
数组类型派生。[……]
因此,
argv
是一个可修改的左值,可在此处用作后缀增量运算符的操作数。所示代码中的char*argv[]
与char**argv
完全相同。我更喜欢最后一种格式:任何地方都没有数组。您可能想阅读的第6节。@pmg:true-我想我在思想上区分了概念数组(在本例中是连续的指针序列)和严格意义上的“C语言律师”数组。@Ananya:/prog
是命令行的第一部分-通常是用于调用程序的名称(但不一定)。在这种情况下,它只是运行一个名为prog
的程序,没有进一步的命令行参数。没有编译错误,因为代码没有问题。@Ananya:您读过下面的答案和注释吗?argv[]
包含程序名(在元素0中)和任何命令行参数(在元素1..argc-1中)。您可能还想解释一下,尽管命令行参数是char*argv[]
,这在函数中衰减为char**argv
,这使得增加argv
是合法的,即argv++
-我想这可能是混淆OP的原因之一。@PaulR我想我终于把它弄清楚了,先生,你能回顾一下吗?
while(*argv !=NULL)
printf("%s\n", *argv)); //print the string pointed to by `argv`
argv++; //increment argv to point to the next string