C中的字符指针意外工作

C中的字符指针意外工作,c,pointers,C,Pointers,我以为它应该打印'c',但它打印'b'。请解释。这是由于,它使后缀++运算符增加指针,而不是取消引用的值 因此,表达式返回第一个'a',它通过前缀增加到'b',但由于上述运算符的优先级,后缀的增加实际上是指针的增加。这是因为,它使后缀++运算符增加指针,而不是取消引用的值 因此,您的表达式返回第一个'a',其前缀增加为'b',但由于上述运算符的优先级,后缀的增加实际上是指针的增加。这里后缀的优先级最高,但它只会在语句之后影响值。++和*具有相同的优先级,并且它们具有正确的关联性。它的工作原理如下

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

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

因此,表达式返回第一个
'a'
,它通过前缀增加到
'b'
,但由于上述运算符的优先级,后缀的增加实际上是指针的增加。

这是因为,它使后缀
++
运算符增加指针,而不是取消引用的值


因此,您的表达式返回第一个
'a'
,其前缀增加为
'b'
,但由于上述运算符的优先级,后缀的增加实际上是指针的增加。

这里后缀的优先级最高,但它只会在语句之后影响值。++和*具有相同的优先级,并且它们具有正确的关联性。它的工作原理如下:

*p->计算结果为a


然后计算为“b”的+++a在这里后缀具有最高的优先级,但它只会在语句之后影响值和*具有相同的优先级,并且它们具有正确的关联性。它的工作原理如下:

*p->计算结果为a


然后计算为“b”的+++a可以将表达式分解如下,这可以澄清发生了什么

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

编辑:编辑以澄清根据注释修改(*p)

表达式可以分解如下,这可以澄清发生了什么

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


<编辑>:编辑修改(*p)每个注释< /p>@,这是C++的,而不是C。这也不是像这个问题中未定义的行为(因为P本身没有被重用)。它是意外的,因为它是胡言乱语。即使有人能证明它是“合法的”,你也不应该真正去编码。我抗议:把它作为一个复制品来关闭是一种不公正的行为;表达式没有与在单个表达式中修改相同值两次相关的未定义行为,这就是另一个问题。然而,代码中使用的是代码> ++*p++<代码>,并试图修改一个字符串,这是一个好的复制。@ UR是C++的,不是C。这不是像这个问题那样的未定义的行为(因为P本身没有重用)。它是意外的,因为它是胡言乱语。即使有人能证明它是“合法的”,你也不应该真正去编码。我抗议:把它作为一个复制品来关闭是一种不公正的行为;表达式没有与在单个表达式中修改相同值两次相关的未定义行为,这就是另一个问题。但是,中的代码确实使用了
++*p++
,并试图修改一个文本字符串-这是一个很好的副本。该死的打败我了哈哈,我真的正要发布同样的东西该死的打败我了哈哈,我真的正要发布同样的东西这是一个甚至定义好的行为吗?动作序列似乎未定义。我认为,在这种情况下,运算符优先级和绑定规则的应用足够清楚,因此不会是未定义的行为。
c=++*p++
是完全定义的行为,只要
p
指向可修改的数据。在问题中,它指向一个不能修改的字符串文字;然而,避免这个问题很简单(
char a[]=“ayqm”;char*p=a;
),而且这个表达式是100%合法的——尽管在正常业务过程中不应该在审阅过的代码中使用。我认为这是不对的。
*p++
的值也应该增加
p
现在正确地指向
'y'
,但是
'a'
的值也应该是a
'b'
。但是你的步骤并没有反映这一点。@GrijeshChauhan:在什么情况下你认为
+++p[i++]
是未定义的行为?假设
p
i
没有以某种扭曲的方式出现别名,并且
i
被适当地初始化为
p
所指向的对象数组范围内的索引,则表达式
+++p[i++]
是格式完美、定义完整的行为。如果
i
太大(或太小),或
p
指向只读数据,则您有问题;否则就好了。被禁止的行为是在序列点之间两次修改单个值,如
a[i++]=++i,等等。这甚至是定义的行为吗?动作序列似乎未定义。我认为,在这种情况下,运算符优先级和绑定规则的应用足够清楚,因此不会是未定义的行为。
c=++*p++
是完全定义的行为,只要
p
指向可修改的数据。在问题中,它指向一个不能修改的字符串文字;然而,避免这个问题很简单(
char a[]=“ayqm”;char*p=a;
),而且这个表达式是100%合法的——尽管在正常业务过程中不应该在审阅过的代码中使用。我认为这是不对的。
*p++
的值也应该增加
p
现在正确地指向
'y'
,但是
'a'
的值也应该是a
'b'
。但是你的步骤并没有反映这一点。@GrijeshChauhan:在什么情况下你认为
+++p[i++]
是未定义的行为?假设
p
i
没有以某种扭曲的方式出现别名,并且
i
被适当地初始化为
p
所指向的对象数组范围内的索引,则表达式
+++p[i++]
是格式完美、定义完整的行为。如果
i
太大(或太小),或
p
指向只读数据,则您有问题;否则就好了。被禁止的行为是在序列p之间两次修改单个值