这段C代码的输出是什么(在没有任何命令行参数的情况下运行)?

这段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]应包含指向字符串的指针,这些指针是给定的 程序启动前主机环境定义的实现值。 目的是向程序提供程序启动前确定的信息 来自托管环境中的其他位置。如

这段C代码的输出是什么(在没有任何命令行参数的情况下运行)

条件为true,这将导致编译时错误,因为
*(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
    与现在的
    argv[1]
    相同,它为NULL,条件为false,并命中最后的
    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