0
#include<stdio.h>
int main()
{
    char *s[] = { "knowledge","is","power"};
    char **p;
    p = s;
    printf("%s ", ++*p);
    printf("%s ", *p++);
    printf("%s ", ++*p);

    return 0;
}

输出:

知识知识

请特别解释第二条语句的输出。printf()我认为因为++*具有相同的优先级,因此*p++ p应该先递增然后使用*(一元运算符从右到左的关联性)。

4

4 回答 4

5

第一个递增 *p 并显示字符串(将其设置为 knowldege 中的 n)。第二个显示字符串 *p 然后递增 p(将其移动到“is”)。第三个递增 *p 然后显示字符串(从“is”中的 s 开始)。

于 2012-06-22T19:42:25.167 回答
3

根据C++ 运算符优先级

  1. "*" 与前缀"++ " 具有相同的优先级,但必须从右到左进行评估。

    printf("%s", ++*p);

所以 first*p被评估,然后++(*p),导致第一个字符串中的第二个字符。

  1. “*”的优先级低于后缀 ++”。

    printf("%s", *p++);

所以 firstp是递增的,它是一个post-increment。操作返回的值是原始值。这样,*对原始指针进行操作,该指针指向第一个字符串上的第二个字符。

请注意,这一次,++是操作结束p,而不是结束*p

  1. 由于“2”,p指向第二个字符串。当你这样做时,++*p你现在指向第二个字符串的第二个字符(“s”)。当您再次使用pre-increment时,传递给的值printf已经更改。

    printf("%s", ++*p);

如果您进行一些更改并打印指针值(忽略警告),我可能会更清楚:

printf("%s [%p]\n", ++*p, p );
printf("%s [%p]\n ", *p++, p );
printf("%s [%p]\n ", ++*p, p );

nowledge [0x7fff6f5519e0]
nowledge [0x7fff6f5519e8]
 s [0x7fff6f5519e8]
于 2012-06-22T19:54:54.093 回答
2

增量后缀运算符 ( p++) 计算的值是p。递增前缀运算符 ( ++p) 计算的值是p+1

在您的第二个 printf 中,*p++评估*p将评估的内容,但具有递增的副作用p

于 2012-06-22T19:44:32.123 回答
1

当遇到棘手的运算符序列时,通常很容易将其重写为一系列简单的语句。你的块变成:

p[0]++;  //skips over the 'k' in knowledge
printf("%s", *p);
printf("%s", *p);
p++;     //moves to the next word
p[0]++;  //skips over the 'i' in is
printf("%s", *p);
于 2012-06-22T21:56:01.977 回答