0
int main()
{
    char *p = "ayqm";
    char c;
    c = ++*p++;
    printf("%c",c);
}

我认为它应该打印'c',但它打印'b'。请解释。

4

3 回答 3

3

这是由于运算符优先级,它使后缀++运算符增加指针而不是取消引用的值。

所以你的表达式返回第一个'a'增加前缀增加的第一个'b',但由于上面提到的运算符优先级,后缀增加实际上是指针。

于 2013-08-31T17:00:01.067 回答
3

该表达式可以分解如下,这可以阐明发生了什么。

c = ++*p++;

steps:

1) (*p)         // (*p) == 'a'
2) ++(*p)       // (*p) == 'b'
3) c = (*p)     // c == 'b'
4) p++          // p -> 'y'

编辑:编辑以澄清每个评论对 (*p) 的修改

于 2013-08-31T17:10:49.143 回答
0

这里后缀具有最高优先级,但它只会在语句之后影响值。++ 和 * 具有相同的优先级,并且它们具有右结合性。在那里它会像这样工作:

*p -> 计算结果为 a

然后 ++'a' 计算结果为 'b'

于 2013-08-31T17:05:54.770 回答