我从一些练习中得到了这个片段和问题:以下代码的输出:
main()
{
char *p = "ayqm";
printf("%c", ++*(p++));
}
我的预期答案是z
,但实际答案实际上是b
。怎么可能?
稍后编辑:片段是从练习中获取的,并没有关注除printf()
代码区域以外的字符串文字或语法问题。
如发布,该程序有多个问题:
"ayqm"
,它在C标准中描述为未定义的行为。printf
没有适当的声明,再次产生未定义的行为。main
原型已经过时,C标准不再支持。'a'+1
确实产生'b'
,但C标准不保证。实际上,在较旧的大型计算机中仍然使用的EBCDIC字符集中,字母是单个单调序列(即:'a'+1 == 'b'
,但在此字符集中为'i'+1 != 'j'
)。这是一个更正版本:
#include <stdio.h>
int main(void) {
char str[] = "ayqm";
char *p = str;
printf("%c\n", ++*(p++));
return 0;
}
p
后递增,这意味着p
的当前值用于*
运算符,p
的值在下一个序列点之前递增,即调用printf
函数。然后通过p
,'a'
读取的字符递增,这可能会也可能不会产生'b'
,具体取决于执行字符集。
在printf
回到main
函数后,p
指向str[1]
,str
包含字符串"byqm"
。
您的程序具有未定义的行为,因为它正在尝试修改字符串文字“ayqm”。根据标准尝试修改字符串文字导致未定义的行为,因为它可能存储在只读存储中。
指针p
指向字符串文字“ayqm”。这个表达
printf ("%c", ++*(p++));
最终试图修改指针p
指向的字符串文字。
程序中的未定义行为包括它可能执行不正确(崩溃或静默生成不正确的结果),或者它可能偶然地完成程序员的意图。