gpt4 book ai didi

c - 为什么这些构造使用前后递增的未定义行为?

转载 作者:太空宇宙 更新时间:2023-11-04 04:39:51 24 4
gpt4 key购买 nike

#include <stdio.h>

int main(void)
{
int i = 0;
i = i++ + ++i;
printf("%d\n", i); // 3

i = 1;
i = (i++);
printf("%d\n", i); // 2 Should be 1, no ?

volatile int u = 0;
u = u++ + ++u;
printf("%d\n", u); // 1

u = 1;
u = (u++);
printf("%d\n", u); // 2 Should also be one, no ?

register int v = 0;
v = v++ + ++v;
printf("%d\n", v); // 3 (Should be the same as u ?)

int w = 0;
printf("%d %d\n", ++w, w); // shouldn't this print 1 1

int x[2] = { 5, 8 }, y = 0;
x[y] = y ++;
printf("%d %d\n", x[0], x[1]); // shouldn't this print 0 8? or 5 0?
}

最佳答案

C 有未定义行为的概念,即某些语言结构在语法上是有效的,但您无法预测代码运行时的行为。

据我所知,该标准没有明确说明为什么存在未定义行为的概念。在我看来,这仅仅是因为语言设计者希望在语义上有一些余地,而不是要求所有实现以完全相同的方式处理整数溢出,这很可能会带来严重的性能成本,他们只是留下了行为未定义,因此如果您编写导致整数溢出的代码,任何事情都可能发生。

那么,考虑到这一点,为什么会出现这些“问题”?该语言明确表示某些事情会导致 undefined behavior .没有问题,不涉及“应该”。如果当涉及的变量之一被声明为 volatile 时未定义的行为发生变化,这不会证明或改变任何东西。它是未定义的;你无法对这种行为进行推理。

你最有趣的例子,那个

u = (u++);

是未定义行为的教科书示例(参见维基百科关于 sequence points 的条目)。

关于c - 为什么这些构造使用前后递增的未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27438971/

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