gpt4 book ai didi

c - "p = p + (*p)++ * 3 + c;"会导致未定义的行为吗?

转载 作者:太空狗 更新时间:2023-10-29 15:30:00 27 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Undefined Behavior and Sequence Points

按照标准中的定义,E1 += E2 几乎与 E1 = E1 + E2 相同,只是 E1 仅计算一次。因此,另外,“p += (*p)++ + c”;导致未定义的行为?

在 gcc/g++ (4.7/4.4) 中尝试以下代码。有两种结果:bxxxxx (g++4.7) 或 axbxxx (gcc, g++ 4.4)。如果我们在代码中执行 (1) 而不是 (2),我们只能得到 axbxxx。

#include <stdio.h>

int main() {
char s[] = "axxxxx";
char *p = s;

printf("s = %s in the beginning.\n"
"p is pointed at the %d-th char.\n", s, p - s);
//p = p + (*p)++ * 3 + 2 - 'a' * 3; // (1)
p += (*p)++ * 3 + 2 - 'a' * 3; // (2)
printf("p is moved ahead by %d steps\n", p - s);
printf("s = %s after the operation.\n", s);
return 0;
}

我找不到它导致未定义行为的原因,也不能断言这是 gcc 的错误。

对于 axbxxx 结果,我也无法理解为什么一个操作数或后++ 被计算两次(一次获得值,然后保存它)。因为在标准中说“1 ...被添加到它”,我认为地址应该只被评估一次。如果后++ 的操作数的地址只被求值一次,不管赋值的执行顺序如何,表达式的效果都是一样的。

===更新===

阅读第一条评论中链接的文档后,我认为以下规则可能很重要:

“2) 此外,仅应访问先前值以确定要存储的值。” .

那么,p在“p = p + (*p)++ * 3 + c”中的访问是否被认为是*p的“先验值”的一部分,与要存储的值无关在 *p?

IMO,这条规则没有被违反。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com