“知识就是力量” C语言难题

时间:2018-08-03 06:22:59

标签: c

输出应该是什么? 这是代码:

#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个字符(请参见下图) click here to view 1st image

但是当我后递增时,指针会跳过整个元素 click here to view 2nd image

为什么后期发布和前置增量工作不同?在两种情况下,根据我的说法,它们应该仅跳1个字节/字符。我期望输出是诺言 诺言 知识 (尽管我错了,输出是nowledge nowledge)

4 个答案:

答案 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)相同:*ps数组中的第一项,它是指向"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)++先解除引用,然后再递增被解除引用的对象

如果遇到困难,只需使用括号就可以显式地显示编译器要评估的内容和顺序。