#include <stdio.h>
int main(void)
{
char s[] = {'a','b','c','\n','c','\0'};
char *p;
p=&s[3];
printf("%d\t",++*p++);
printf("%d",*p);
return 0;
}
输出:11 99 答案 0 :(得分:2)
我看到的唯一可能令人困惑的是
++*p++
Postincrement的优先级高于取消引用运算符,所以完全括号看起来像
++(*(p++))
哪个postincrements p
,取消引用p
的原始值以获得char
,然后预先计算char
的值,然后通过以下方式打印新值: printf
为整数。
因此,p
和p
指向的内容都会增加。
答案 1 :(得分:0)
您应该查看运算符优先级
表达式++*p++
被编译器评估为((*p) + 1)
,它也有副作用:它增加*p
和p
的值。使用与ASCII兼容的字符集,此指令在标准输出上打印11
('\n'+1 == 10+1 == 11
)。第二次printf
调用会打印s[4]
('c'
)的值。
答案 2 :(得分:0)
指针只是表示内存位置的整数。 C中的数组始终位于连续的内存块中。所以当你有一个指向数组第三个元素的指针,并从指针中添加1时,它指向第四个元素。
如果您对++*p++
感到困惑:这是因为预增量(++p)
和后增量(p++)
之间存在差异。对于那些讨厌C ++的人来说,有一个简单的绰号:
“C ++ - 改变语言,回归旧问题”。