i=i++ 的输出差异+ ++c;和 i=++i + c++;

发布于 2024-11-16 23:26:22 字数 380 浏览 1 评论 0原文

我不知道这是否是特定于编译器的,但是当我尝试在 DevC++ 中运行两个表达式

i=c=b=0; i=i++ + ++c 给出 2i=++i + c++ 给出 1

但是 b=i++ + ++cb=++i + ++c 为两个表达式生成结果 1

我确实知道根据 C 标准规范,在同一表达式中将变量递增两次会导致未定义的值,但我很好奇编译器如何生成这些输出。有人可以解释一下如何以及为什么吗?

I don't know if this is compiler specific but when I tried running the two expressions in DevC++

When i=c=b=0; i=i++ + ++c gives 2 whereas i=++i + c++ gives 1

But
b=i++ + ++c and
b=++i + ++c produces the result 1 for both expressions.

I do know that incrementing a variable twice in the same expression results in an undefined value according to the C standard specification but I'm curious how the compiler produces these output. Could someone please explain how and why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

眼藏柔 2024-11-23 23:26:22

i++ + ++cc 递增(到 1),然后 0 + 1 存储在i,最后 i 递增,得到 2

++i + c++i 递增(到 1),然后 1 + 0 存储在i,然后 c 递增。

这就是我理解编译器所做的事情的方式,但正如其他人所说,不要指望其他地方的这种行为。

i++ + ++c, the c is incremented (to 1), then 0 + 1 is stored in i, and finally i is incremented, giving 2.

++i + c++, the i is incremented (to 1), then 1 + 0 is stored in i, then c is incremented.

That's how I would understand what the compiler did, but as everyone else is saying, don't count on this behavior elsewhere.

心意如水 2024-11-23 23:26:22

你确定 b = ++i + ++c = 1 吗?或者是 b = ++i + c++ ?这是我对你的问题的解释。

    i = i++ + ++c
    (i = 0 + 1)++
    i = 2
    c = 1

    i = ++i + c++
    (i = 1 + 0)
    i = 1
    c = 1

Are you sure b = ++i + ++c = 1? or was it b = ++i + c++? Here is my explanation of your question.

    i = i++ + ++c
    (i = 0 + 1)++
    i = 2
    c = 1

    i = ++i + c++
    (i = 1 + 0)
    i = 1
    c = 1
挽梦忆笙歌 2024-11-23 23:26:22

i++++i 完全不同,i++ 是后增量,意味着在表达式中计算 i 然后一旦评估就增加。 ++i 表示先递增然后计算表达式。
我在您的示例中看到您设置了 i = ++i/i++,这是评论中提到的未定义行为。

i++ and ++i are completely different, i++ is post increment which means evaluate i in the expression and then increment once its evaluated. ++i means increment then evaluate the expression.
I see in your example you set i = ++i/i++, this is undefined behavior as mentioned in a comment.

君勿笑 2024-11-23 23:26:22

C99 标准明确指出(6.5,p2)

在上一个和下一个序列点之间,对象的存储值最多应通过表达式的求值修改一次。

表达式 i = ++i;i = i++; 都更新 i 两次,这是不允许的。

The C99 standard says explicitly (6.5, p2)

Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression.

The expressions i = ++i; and i = i++; both update i twice, which is not allowed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文