c语言中的后减量

c语言中的后减量,c,C,可能重复: 请解释该程序如何继续打印i=2 #include<stdio.h> void main() { int i=1; i=i+2*i--; printf("%d",i); } #包括 void main() { int i=1; i=i+2*i--; printf(“%d”,i); } 根据逻辑,它应该计算值3,因为--1+2*1=3 但这首先计算i,然后更新i的值。为什么会这样Si=i+2*i-- 此代码调用未定义的行为。您正在修改i并在单个

可能重复:

请解释该程序如何继续打印i=2

#include<stdio.h>
void main()
{
    int i=1;
    i=i+2*i--;
    printf("%d",i);
}
#包括
void main()
{
int i=1;
i=i+2*i--;
printf(“%d”,i);
}
根据逻辑,它应该计算值3,因为--1+2*1=3 但这首先计算i,然后更新i的值。为什么会这样S

i=i+2*i--

此代码调用未定义的行为。您正在修改
i
并在单个序列点内读取它。请阅读


修改表达式中的变量,然后将结果赋给同一个变量是未定义的行为,因此您看到的任何行为在技术上都是正确的(包括重新启动计算机或破坏宇宙)。根据第6.5.2节:

在上一个和下一个之间,一个物体应有其自身的特性 通过评估一个 表情

要修复此问题,请将后减量移出表达式,如下所示:

int main() {
    int i=1;
    i=i+2*i;
    i--;
    printf("%d",i);
    return 0;
}
预递减或预递增是在同一语句上进行的,而后递增和后递减是在下一语句上进行的。我记得我在什么地方读过 这是我解释过的,目的是让你清楚地了解手术前后的情况

但大多数人相信
当你试图对同一个变量进行递增和递减操作时,它的未定义行为将被赋值

,你没有从上一个问题中学到任何东西。(此外,它是
int main
,而不是
void
)void main()??????????????天哪,使用int main()@ross1。请学会接受答案。2.请学习阅读你所问问题的答案。这和你今天早些时候问的问题是一样的。@DavidHeffernan明白了,先生…!:)语句“在同一语句上进行预减量或预增量,而在下一语句上进行后增量和后减量”是不正确的。除了要求在下一个序列点之前应用副作用外,没有指定副作用的确切应用时间。在像
a=b*c++
这样的定义明确的表达式中,副作用可以在
c++
求值之后,或者在
b*c++
求值之后,或者在
b*c++
的结果分配给
a
之后立即应用于
c
i = i + 2 * i--;
i = 1 + 2 * 1;  (as it is post decrement so the i value is still 1)
i = 1 + 2;   (multiplication has higher priority, post decrement still not made)
i = 3 ;
on the next statement
printf("%d",i); the post decrement is done here on i and i value is 3 so 3 -1 = 2
The output is 2