我从一些练习和问题中得到了以下代码片段:这是以下代码的输出:
main()
{
char *p = "ayqm";
printf("%c", ++*(p++));
}
我的预期答案是z
,但实际答案实际上是b
。那怎么可能?
以后的编辑:该摘录直接来自练习,不关注printf()
代码区以外的字符串文字或语法问题。
答案 0 :(得分:2)
您的程序具有未定义的行为,因为它试图修改字符串文字“ ayqm”。按照标准,尝试修改字符串文字会导致未定义的行为,因为它可能存储在只读存储器中。
指针p
指向字符串文字“ ayqm”。这个表情
printf ("%c", ++*(p++));
最终尝试修改指针p
所指向的字符串文字。
程序中未定义的行为可能会导致执行不正确(崩溃或无提示地生成不正确的结果),或者可能偶然地执行了程序员想要的操作。
答案 1 :(得分:2)
发布后,该程序存在多个问题:
"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"
。