c语言的自增自减问题

供稿:hz-xin.com     日期:2025-01-18
c语言关于自增自减的问题

计算:从右往左,并输出到“缓冲区”。
2.缓冲区是一堆栈
3.
第一步:处理后面的“i--”。8进入缓冲区,i=7。缓冲区:8
<-(指针)
第二步:处理“i++”。7进入缓冲区,i=8。缓冲区:7
8<-
第三步:处理”--i“。8进入缓冲区,i=7.缓冲区:8
7
8
第四步:处理“++i”
先自增1,然后8进入缓冲区,i=8
.缓冲区:
8
8
7
8
4.输出缓冲区数据(栈规则):8
8
7
8
另外自增
自减
还可能和编译器有关系
淡定
语法问题
不要太纠结

++b是说明先让数自加一,然后再执行b,就是(8+1)+(8+1)+(8+1),b值加三次一,就是11,然后再执行y值,11+11+11等于33

计算:从右往左,并输出到“缓冲区”。

1、缓冲区是一堆栈

2、第一步:处理后面的“i--”。8进入缓冲区,i=7。缓冲区:8 <-(指针)

第二步:处理“i++”。7进入缓冲区,i=8。缓冲区:7 8<-

第三步:处理”--i“。8进入缓冲区,i=7.缓冲区:8 7 8

第四步:处理“++i”  先自增1,然后8进入缓冲区,i=8 .缓冲区: 8 8 7 8

3、输出缓冲区数据(栈规则):8 8 7 8

另外自增 、自减 、还可能和编译器有关系 。

扩展资料:

后缀表达式 2级

postfix-expression [ expression ],数组下标运算。

postfix-expression ( argument-expression-list),函数调用,括号内的参数可选。

postfix-expression . identifier,成员访问,

postfix-expression -> identifier,成员访问,->号之前应为指针。

postfix-expression ++,后缀自增

postfix-expression --,后缀自减

( type-name ) { initializer-list }

( type-name ) { initializer-list , } 复合初始化,C99后新增。

参考资料:百度百科-C语言运算符



函数参数的求值顺序是自右向左”更是大错特错。楼主,C语言跟大多数语言一样,没有规定表达式的求值顺序,除了以下几个顺序点:
;(分号,标志一条语句结束)
,(逗号操作符,函数参数列表里面的逗号只起分隔作用,不是逗号操作符)
&&和||(逻辑与,逻辑或)
? : (条件运算符)
()(if,while,for, do..while,以及函数调用)
这些统称为顺序点,它们的求值顺序有规定。我这里只给你说明逗号操作符,其他的不一一作介绍(不然能写一大篇呢),你自己参考相关资料。
逗号表达式最简单的情形如下:
exp1, exp2;
C语言保证exp1在exp2之前求值,并且exp1求值的副作用保证在逗号之前生成。所以象下面这个逗号表达式:
int i = 1;
i++, (i == 2);
最后的值就是1,因为逗号表达式的前半部分i++的副作用(i自增1)在逗号之前已经生成,所以当执行到(i == 2)的时候,i的值已经是2了,所以i == 2成立,(i == 2)的值便作为整个逗号表达式的值。

但是,对函数原型,函数定义,函数调用,C语言里面明确说明,参数列表里面的逗号不是逗号操作符,只起到分隔作用,所以这里的逗号不再是一个顺序点,那它前后的表达式的求值顺序就是任意的,并且所有带副作用的表达式的副作用都要等到下一个顺序点之后才是确定的,也就是说你只有等到下一个顺序点之后,你才能准确得依赖这些表达式产生的副作用。
所以,像这样的函数调用
foo(i++, ++i);是得不到准确的结果的。因为这里逗号不是逗号操作符,所以就算编译器选择的是从左到右的求值顺序,由于C语言不再保证i++的副作用在逗号之前生成,算到++i的时候,都不确定i到底有没有自增1,不确定性就在这里产生了。再者,如果编译器选择的是从右到左求值,同样产生不确定性,这样一来,传进函数foo的两个参数的值就可能不同,那么最后的结果当然也就不同了。你这里一样,printf是一个函数,
printf("%d,%d,%d\n",++i,--i,-i++);
是函数调用,括号内的所有逗号都不是逗号操作符,而只起到分隔参数的作用。所以++i,--i,-i++这三个表达式的求值顺序是任意的,编译器想怎么算就怎么算,不同的编译器的“想法”可能相同可能不同,结果就可能一样可能不一样。这才是楼上的各位得到不同结果的真正原因!!!

楼主要好好参考顺序点的定义和作用,并且牢记下面这条规则:
C语言里面明确指出:在两个顺序点之间两次改变同一个变量的任何尝试得到的结果都是不确定的!
你这里
int i=10;
printf("%d,%d,%d\n",++i,--i,-i++);
的两个顺序点分别是int i=10;的分号,和包围printf的参数的括号,C语言只保证位于两个顺序点之间的表达式求值产生副作用在第二个顺序点之前生成,但不保证两个顺序点之间所有表达式的求值顺序。你这里++i,--i,-i++三个表达式企图在两个顺序点前一个分号和()之间三次改变同一个变量i的值,所以结果注定是不确定的。至于为什么C语言要规定相邻顺序点之间的表达式以任意顺序求值,是为了给编译器更多的自由空间,让底层运算操作能由编译器调度安排从而使运算更有效地执行。
另外,站长团上有产品团购,便宜有保证

这里首先说一句,你这种用法应该是不合法的,至少是很不可取的。因为像+、-、*、/这类算术运算符C语言并未规定操作数的求值顺序,在不同的编译器上,有可能先求做操作数,也有可能先求右操作数。所以建议不要采用这种不确定的式子。
你这里是先求左操作数,也就是先求++n表达式的值,因为是前缀自增,表达式(左操作数)值为6,此时n也变为6.然后求右操作数值,即表达式n++;的值,因为是后缀自增,所以表达式的值是6,因此第二操作数的值是6,因此结果是36.之后n变为7.

123456789main( ){int x;scanf("%d",&x);if(x++ > 5) //这里x++在判断后,不论是否成立,都会再做一次++,即x=x+1,所以输入6时,if条件为真,然后还会做x=x+1=7printf("%d",x); //到这里时,x=7elseprintf("%d\n",x--); //输入4时,条件不成立 ,但因为有x=x+1=5,所以到这里时,x=5; x--表示先用x , 用完后再--,所以,会先输出5,再做x=x-1=4}

scanf输入6[x=6], x>5成立, 紧接着无条件执行x++[x=7], 由于前面条件满足, printf输出7
scanf输入4[x=4], x>5不成立, 紧接着无条件执行x++[x=5], 由于前面条件不满足, printf输出5, 执行x--[x=4]
因此输入6时得到输出7; 输入4时得到输出5

C语言计算题,关于自加自减运算符计算的问题?
等于9 流程:自增、自减符先进行运算,但是由于前三个都是后缀,所以在执行玩改该行后才进行,所以先是2+2+2+(++i);然后由于前缀的自增符(++i),所以最后一个i变成3,最后变成 2+2+2+3 = 9;但是在执行该行后前三个自增、自减符进行运算,所以i(3)-->i(4)-->i(5)最后 -...

C语言里关于自增自减运算符的问题
我在vc6·0上编写了一下 这是截图 首先是前两个7 因为i++是先赋值在进行加一运算,++i是先加一然后再进行赋值操作,所以a,b中储存着值是7,此时i的值是8 然后是后面两个7,同理 a为7,b为7,此时i为6 同理,-i++中因为++在后面 所以先输出-6,然后在把i加一 这是i变成了7 最后 ...

C语言自增自减问题 为什么q的结果是22呢
这个确实不好理解,解释如下:1.首先递增操作放在前面,是用的计算后结果,比如只有一个的时候,其实值是6,这个没问题吧。2.有问题的事两个的时候,两个加在一起,按理说会觉得是13,前面的6,后面的7,但是实际上不是,这是因为加法操作符是先算完两个部分,然后根据当时的值来算的,也就是说...

C语言自增自减?
在表达式里,像题目这种++,--。在变量前面就是先自增自减再取变量值。在变量后面先取变量值再自增自减。比如:j=i++;意思就是先取i的值赋值给j,以后i再自增。后面代码也是这个意思。你可用这个思路跟着代码走一遍。

哪位高手能我解释一下,关于C语言的自加和自减,越详细越好。
自增(自减类同,以下只以"自增"为例)运算需要留意的一个主要关键点即是前自增(++i)和后自增(i++)的区别,大致说来,二者的区别如下:1) 前自增是"先完成自增,后参与表达式运算"的;后自增却恰恰相反,于是会产生如下区别:int i = 0;printf("%d", i); \/\/ 输出 0printf...

C语言如何编写 实现的一个数的自加与自减?
C语言自增(++)和自减(--)运算符 自增运算符++的功能是使变量的值自增 1,自减运算符--的功能是使变量的值自减 1.自增和自减运算因其表达式中只有一个变量,所以称其为单目运算

什么是C语言中关于自加自减?
自增分前缀自增和后缀自增。无论是什么,执行自增都有1个副作用,就是原来变量的值会增加1。例如int a=1;a++;或int a=1;++a;执行后,a==2。而他们的区别就在于整个自增表达式的值不同。如(a++)的值是变量a自增以前的值,如上面例子,(a++)==1。而(++a)的值则是变量a自增以后的...

C语言自增自减运算符深入剖析
c,d);}结果是什么?而后Eric搜了一下后发现,类似的问题很多,也就是说对自增自减运算符感到迷惑是一个普遍存在的问题,基于此,Eric决定对自增自减运算符做个小小的解析,希望能给C语言爱好者们提供参考,解决对此问题的困惑。自增自减运算符语法自增运算符 ++ 使操作数的值加1,其操作数必须...

为什么不同的编译器在对于c语言的自增自减结果不一样呢
自增有两种,分别为i++,++i 如果a=i++,那么a就等于i原来的值,i再自增,也就是如果加号在后面,i先用本身的值,再做自增 如果是a=++i,那么a就等于i+1,也就是,加号在前,先做自增,在赋值 自减是一样的,送你一句话:如果加号在后,先用本身的值进行赋值,在做自增,如果加号在...

C语言的自增自减运算:x=3 , y=-x+++x x等于多少??帮帮忙谢谢!
y=-(x++)+x 先算x++,即x=x+1,值为4 y=-x+x=0 【备注:运算符的优先级】