输出应该是什么? 这是代码:
#include <stdio.h>
int main()
{
char *s[]={"knowledge","is","power"};
char **p;
p=s;
printf("%s\n",++*p);
printf("%s\n",*p++);
printf("%s\n",++*p);
getchar();
return 0;
}
输出: 诺言 诺言
但这是实际问题, 当我预递增时...指针仅跳了1个字符(请参见下图)
但是当我后递增时,指针会跳过整个元素
为什么后期发布和前置增量工作不同?在两种情况下,根据我的说法,它们应该仅跳1个字节/字符。我期望输出是诺言 诺言 知识 (尽管我错了,输出是nowledge nowledge)
答案 0 :(得分:1)
尽管“ 运算符优先级”很重要(尽管从技术上讲,C没有任何优先级,但是使用了允许的表达式语法,但是您可以deduce a precedence table from that grammar)并说明了{ {1}}递增*p++
-在这里不是 only 问题。
带有类似
的表达式p
重要的只是一元运算符的顺序。有了这些,您必须从右到左查找结果。因此,++*p
首先被取消引用,结果(在您的情况下为第一个字符串的指针)然后再加一。
要使p
递增,您只需更改运算符的位置:
p
首先递增,然后取消引用。
答案 1 :(得分:0)
增量的作用不同。由于operator precedence and associativity,它们只是在处理不同的指针。
特别是:
printf("%s\n",++*p);
++*p
与++(*p)
相同:*p
是s
数组中的第一项,它是指向"knowledge"
的指针。然后++
将该指针加1,因此它指向“知识”。
printf("%s\n",*p++);
*p++
与*(p++)
相同:p++
使p
指向s
数组的第二项,它是指向{{ 1}}。但这只会在之后之后使用"is"
取消对指针的引用(毕竟这是一个 post 增量)。因此,首先再次打印*
(因为在第一步中修改了"nowledge"
数组中的第一个指针),然后s
移至第二项{{1} }。
p
这又与第一步相同(但这一次是"is"
数组中的第二项),因此将打印printf("%s\n",++*p);
。
答案 2 :(得分:0)
在第一种情况++ * p中,评估以++(* p)进行-因此输出将以* p({p
指向knowledge
的形式进行修改。 p完成,它变成nowledge
)
在第二种情况下,* p ++的计算结果为*(p ++)-在这种情况下,指向位置本身也发生了变化。
答案 3 :(得分:-1)
这是关于增量前和增量后运算符,求值顺序及其优先级的普遍困惑
*++p
-----> *(++p)
递增指针p
,然后取消引用
++*p
-----> ++(*p)
先解除引用,然后再递增被解除引用的对象
*p++
-----> *(p++)
先解除引用,然后再递增指针p
(*p)++
-----> (*p)++
先解除引用,然后再递增被解除引用的对象
如果遇到困难,只需使用括号就可以显式地显示编译器要评估的内容和顺序。