为何含++**++argv的C语言printf代码输出为'p'?附命令行参数场景
先看一下这段有点“迷惑性”的代码:
#include<stdio.h> int main(int argc,char *argv[]) { printf("%c",++**++argv); return 0; }
当你执行命令./a.out one two three时,程序输出了p——别急,咱们一步步拆解开,搞清楚每一步到底在做什么。
首先得明白命令行参数argv的结构:argv是一个指针数组,它的每个元素都是指向字符串的指针,对应你传入的命令行参数:
argv[0]指向程序本身的路径:"./a.out"argv[1]指向第一个参数:"one"argv[2]指向第二个参数:"two"argv[3]指向第三个参数:"three"- 数组的最后一个元素
argv[4]是NULL,用来标记数组结束
接下来重点拆解核心表达式 ++**++argv——这里的运算符优先级和结合性是关键,咱们从右往左一步步分析:
++argv:移动argv的指向argv本身是一个指向指针的指针(初始指向argv[0])。前缀++会先让argv的地址偏移,指向数组的下一个元素——也就是argv[1]。现在argv不再指向"./a.out",而是指向"one"的指针。*++argv:取出"one"的首地址
对第一步的结果做解引用,得到argv[1]的值:也就是字符串"one"的首地址,这个指针指向的是"one"的第一个字符'o'。**++argv:取出字符'o'
再做一次解引用,拿到这个字符指针指向的实际字符:'o'。++**++argv:自增字符'o'
最后对'o'做前缀自增操作。'o'的ASCII码是111,自增1后变成112,对应的字符就是'p'。
最后printf("%c", ...)把这个自增后的字符输出,所以结果就是p。
⚠️ 额外提醒:字符串字面量(比如"one")在很多系统中是存储在只读内存区域的,这段代码修改它的行为其实属于未定义行为——在某些编译器或操作系统下可能会直接崩溃。题目里能输出p,说明是在允许这种操作的环境中运行的。
内容的提问来源于stack exchange,提问作者Anonymous

