gpt4 book ai didi

c - 以下哪些后自增和预自增运算符的组合在 C 语言中具有未定义的行为?

转载 作者:太空狗 更新时间:2023-10-29 15:11:33 25 4
gpt4 key购买 nike

我读过,Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc...)尝试理解 Sequence points on "comp.lang.c FAQ"在浪费了 2 个多小时的时间试图通过 gcc 编译器解释以下结果之后。

expression(i=1;j=2)     i       j       k
k = i++ + j++; 2 3 3
k = i++ + ++j; 2 3 4
k = ++i + j++; 2 3 4
k = ++i + ++j; 2 3 5

k = i++ + i++; 3 2
k = i++ + ++i; 3 4
k = ++i + i++; 3 4
k = ++i + ++i; 3 6

i = i++ + j++; 4 3
i = i++ + ++j; 5 3
i = ++i + j++; 4 3
i = ++i + ++j; 5 3

i = i++ + i++; 4
i = i++ + ++i; 5
i = ++i + i++; 5
i = ++i + ++i; 6

问题:

  1. 我想知道上图中显示的所有表达式(4 组)是否都有未定义的行为?如果它们中只有一些具有未定义的行为,哪些有哪些没有?

  2. 对于已定义的行为表达式,请您展示(而不是解释)编译器如何评估它们。只是为了确保我是否正确地获得了这个预增量和后增量。

背景:

今天,我参加了一次校园面试,要求我解释给定 i 值时 i+++++i 的结果。在gcc中编译那个表达式后,我意识到我在面试中给出的答案是错误的。我决定以后不再犯这样的错误,因此尝试编译前后增量运算符的所有可能组合,并在 gcc 中编译它们,然后尝试解释结果。我挣扎了2个多小时。我找不到评估这些表达式的单一行为。所以,我放弃了,转向stackoverflow。一点点阅读文件后,发现有类似 sequence point 和未定义行为的东西。

最佳答案

除了第一组,其他三组的所有表达式都有未定义的行为。

如何评估定义的行为(第 1 组):

i=1, j=2;

k=i++ + j++; // 1 + 2 = 3
k=i++ + ++j; // 1 + 3 = 4
k=++i + ++j; // 2 + 3 = 5
k=++i + j++; // 2 + 2 = 4

这很简单。后增量与前增量。

在第 2 组和第 4 组中,很容易看到未定义的行为。

第 2 组具有未定义的行为,因为 = 运算符未引入序列点。

关于c - 以下哪些后自增和预自增运算符的组合在 C 语言中具有未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13615243/

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