当前位置:文档之家› C语言自增自减问题总结

C语言自增自减问题总结

C语言自增自减问题总结
C语言自增自减问题总结

C语言自增自減问题总结

在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C 语言为这种操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是单目运算符,是从右向左结合的算术运算符。学习和应用这两个运算符时应注意以下几点:

我将自增自减运算符和变量结合在一下的表达式称为自增自减表达式,如

x++,--I等。通常情况下就有以下的结论:

1‘’前缀表达式:++x, --x; 其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即“先变后用”,也就是变量的值先变,再用变量的值参与运算。

2、后缀表达式:x++, x--; 先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化,。

如a=8; b=a++; c=++a; 其中赋给变量b的值为表达式(a++)的值,不应该理解为a的值,则b=8, c=10;

3、自增、自减运算只能用于单个变量,只要是标准类型的变量,不管是整型、实型,还是字符型变量等,但不能用于表达式或常量。如:++(a+b), 与5++,const int N=0; N++; 等都是错误的。而i+++j++、++i+(++j)、++a+b++、++array [--j];等,这些都是合法的。

4、再说结合性与结合方向

编译器对程序编译时,从左到右尽可能多地将字符组合成一个运算符或标识符,因此i+++j++等效于(i++)+(j++),两个“++”作用的对象都是变量,这是合法的;而++i+++j等效于++(i++)+j,第1个“++”作用的对象是表达式

“i++”,这是不允许的。

自增自减运算符是单目运算符,其结合性是从右到左。表达式k=-i++等效于k=(-i)++还是k=-(i++)?。因为负号也是单目运算符,因此,上式从右到左结合,等效于k=-(i++);若i=5,则表达式k=-i++运算之后k的值为-5,i的值为6。此赋值表达式的值即为所赋的值-5。不要因为k=-i++等效于k=-(i++)

就先做“++”运算!这里采用的是“先用后变”,即先拿出i的值做负号“-”运算,把这个值赋给变量k之后变量i才自增。

5、注意运算符的副作用

C语言允许在一个表达式中使用一个以上的赋值类运算,包括赋值运算符、自增运算符、自减运算符等。这种灵活性使程序简洁,但同时也会引起副作用。这种副作用主要表现在:使程序费解,并易于发生误解或错误。例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一。对于这种情况,为了增强程序的可读性与可移植性,在一个表达式中,就应该用简单的自增与自减运算,不用对同一变量进行多次自增自减运算的表达式,否则,其他人可能看不懂,换个运行环境也可能是不同的结果。我相信,在考试试题中也是不会出现象这种有不同结果的试题的,请读者放心。当然,为了丰富知识,了解一下这些内容也是必要的。

以下内容是经查阅资料所得:用各种表达式上机测试,给出VC++环境下连续自增(自减)运算规则:

1、在一般表达式中和在函数参数中计算的结果相同(这一点与Turbo C环境不同);

2、后缀:同表达式中Turbo C的情况相同:先统一取值后依次自增,如:

int a,i=5; a=i+++i+++i++; a=15, i=8.

3、前缀:前两个自增同Turbo C,即依次自增后统一取值,后面的每个自增后即取值,如:

int a, i=5; a= ++i +(++i)+(++i); a=22, i=8.

4、前后缀混合的情况:

(1) 一般情况:表达式中自左向右计算,参数自右向左运算。前缀自增后取值;后缀(或变量)取值依其所处位置而定,有连续多个将统一取值,其自增在语句结束前进行。

(2) 前后缀各有一个的情况:设int i=5; 由于i++*++i应满足交换率与

++i*i++相同,规定按后者计算故为36。实验2内容4:int i=5;

printf("%d,%d\n", --i, i++*++i ); 打印5,36。

(3) 若i++或++i或两者有多于一个的情况:++i有两个以上在一起时最左边的连续自增同3、,其余每个自增后取值,如:int i=5;

printf("%d\n%d\n",--i,(++i)+(i++)+(i++)+(++i)); 打印6和25

printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+(++i)+(i++)); 打印8和40 printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+i+(++i)+(++ i)); 打印9和49

(4) 函数参数中有括号时,括号参数优先计算,其余参数仍自右向左计算,如:

int i=9,j=8; printf("%d %d\n", (++i, j--), ++i); 打印8 11

printf("%d %d %d\n", (++i, j--), ++i, i); 打印8 11 10

(5) 最后i的值等于原值加总自增次数减自减的次数.

克服这类副作用的方法是,尽量把程序写得易懂一些,即将费解处分解成若干个语句。如:k=i+++j:可写成k=i+j:i++:而类似(i++)+(i++)+(i++)这类连续自增、自减的运算最好不要使用,以避免疑团的出现,同时也可减少程序出错的可性能。

最后感谢为了得到正确结果而花较多时间去上机实践的人们,祝你幸福快乐!

关于C语言自增自减运算符

C语言自增、自减运算符使用中应注意的问题 ++x 表示取x的地址,增加它的内容,然后把值放在寄存器中; x++ 则表示取x地址,把它的值装入寄存器中,然后增加内存中x的值。 在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。变量i被称为“计数器”,用来记录完成某一操作的次数。C语言为这种计数器操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是从右向左结合的一元算术运算符,优先级为2。学习和应用这两个运算符时应注意以下几点: 1注意表达式的值和变量值的区别 以自增运算符为例,当自增运算符++作用于一个变量时,例如:当i=3时++i这个算术表达式的值为4,同时变量i的值也由原来的3改变为4。一般情况下,计算表达式后不改变变量本身的值,而++运算符和--运算符组成的表达式计算后,则改变变量的值,这称为运算符的副作用。这类运算符在计算表达式时,一定要注意区分表达式的值和变量的值。后面有阐述注意表达式的值和变量值的区别) 2注意前缀运算和后缀运算的区别 仍以自增运算符为例,该运算符可作用在变量之前,例如前面所讲的++i,称为前缀运算;也可作用在变量之后,例如i++,称为后缀运算。在这两种运算中,表达式的值不同:前缀运算后,表达式的值为原变量值加1;后缀运算后,表达式的值仍为原变量值;(也就是我给你说的作为表达式的一部分) int m=1; printf("%d",m++);结果为 1(我给你讲输出的是m本身,表达式的值仍为原变量值) int m=1; m=m++; printf("%d",m);

值为2(这是变量的值,你会问什么时候是变量,像m++单独用是为表达式,在其他式子中是变量如m=1时,m=5+(m++)结果为7)(先把m++的值传给m,然后m再+1,若把原式写为)int n,m=1; n=m++; printf("%d",n);值是不一样的,输出为1。 而变量值不论前缀运算还是后缀运算都加1。自减运算符与自增运算符类似,只要将加1改为减1即可。即前缀运算是“先变后用”,而后缀运算是“先用后变”。(不知你懂不懂啊!) 3注意运算符的运算对象 自增、自减运算符只能作用于变量,而不能作用于常量或表达式。因为自增、自减运算符具有对运算量重新赋值的功能,而常量、表达式无存储单元可言,当然不能做自增、自减运算。只要是标准类型的变量,不管是整型、实型,还是字符型、枚举型都可以作为这两个运算符的运算对象。如以下四个表达式都是合法的:i+++j++、++i+(++j)、++a+b++、++array[--j];而++6、(i+j)++、…A?++、++i+++j、(&p)++这五个表达式却是不合法的。为什么i+++j++合法,而++i+++j却不合法?C的编译器对程序编译时,从左到右尽可能多地将字符组合成一个运算符或标识符,因此i+++j++等效于(i++)+(j++),两个“++”作用的对象都是变量,这是合法的;而++i+++j等效于++(i++)+j,第1个“++”作用的对象是表达式“i++”,这是不允许的。 4注意运算符的结合方向 表达式k=-i++等效于k=(-i)++还是k=-(i++)?因为负号运算符和自增运算符优先级相同,哪一个正确就得看结合方向。自增、自减运算符及负号运算符的结合方向是从右向左。因此,上式等效于k=-(i++);若i=5,则表达式k=-i++运算之后k的值为-5,i 的值为6。此赋值表达式的值即为所赋的值-5。不要因为k=-i++等效于k=-(i++)就先做“++”运算!这里采用的是“先用后变”,即先拿出i的值做负号“-”运算,把这个值赋给变量k之后变量i才自增。

计算机二级c语言自增 自减习题

自增自减 1、下列关于单目运算符++、--的叙述中正确的是 A)它们的运算对象可以是任何变量和常量 B)它们的运算对象可以是char型变量和int型变量,但不能是float型变量 C)它们的运算对象可以是int型变量,但不能是double型变量和float型变量 D)它们的运算对象可以是char型变量、int型变量和float型变量 2、设有以下定义 int a=0; double b=1.25; char c=’A’; #define d 2 则下面语句中错误的是 A) a++; B) b++; C) c++; D) d++; 3、以下选项中,与k=n++完全等价的表达式是 A) k=n,n=n+1 B) n=n+1,k=n C) k=++n D) k+=n+1 4、设正x、y均为整型变量,且x=10 y=3,则以下语句的输出结果是 printf("%d,%d\n",x--,--y); A) 10,3 B) 9,3 C) 9,2 D)10,2 5、设有 int x=11; 则表达式 (x++ * 1/3) 的值是 A) 3 B) 4 C) 11 D) 12 6、以下程序的输出结果是。 #include main() {int i=010 ,j = 10; printf("%d,%d\n",+ +i , j - -); } A) 11,10 B) 9,10 C) 010,9 D) 10,9 7、有以下程序 main() {int m=12,n=34; printf("%d%d",m++,++n); printf("%d%d\n",n++,++m); } 程序运行后的输出结果是 A)12353514 B)12353513 C)12343514 D)12343513 8、有以下程序 main() { int m=3,n=4,x; x=-m++; x=x+8/++n; printf("%d\n",x); } 程序运行后的输出结果是 A) 3 B) 5 C) -1 D) -2

C语言中的自加自减运算-最新资料

C语言中的自加自减运算 C语言作为一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特征,编程功能十分强大。C语言定义了丰富的运算,多达40余种,这给c语言的学习带来了一定的困难。++运算(自加运算)和--运算(自减运算)正是这些运算中极具特点而又非常重要的两种运算,在教学中,历来是教学的难点,而关于这方面的系统的讲解资料又很难找到,本人在c语言教学中,对++和--运算就教学中碰到的问题,做了一些探索性的研究,现归纳总结,以期与同行共勉。 一、运算的定义 1. ++(自加运算)的定义 ++(自加运算)是单目运算,且只能以变量为运算对象,如i++,++a等(i,a为已定义变量),它等效于i=i+1(a=a+1),但是,自加运算又有自己的特点――与其它运算的相关性,虽然对变量i来讲,i++与++i没有什么区别,但当i++和++i还参与其它运算时,i++和++i对整个运算结果的影响是不同的,例如有如下程序段: int i=1 ,s ; s=(i++)+1; printf(“i=%d;s=%d\n”,i,s); 其运行结果是:i=2;s=2

若将程序中s=(i++)+1;换为s=(++i)+1;其它不变,其运行结果就会变为:i=2;s=3 ,此处我们可以看到: i++与++i的不同,并不影响i本身的结果,但却对s的值产生了不同的影响,这是因为系统在处理++i时先对i进行了加1运算,即:i=i+1,然后才参与其它运算,而在执行i++时,现将i的值参与其它运算,然后才给自己加1,所以得到的s的值是不同的,这正是++(自加运算)与众不同的地方。 2. --(自减运算)的定义 与自加运算类似,--(自减运算)也是单目运算,且只能以变量为运算对象,若i为已定义变量,i的自减运算分为--i和i-- ,两者对i自身的作用是一样的,即i=i-1 ,但当它们还参与其它运算时,--i先执行自减1运算,然后以i的值参与其它运算,i--则先以i值参与其它运算,然后对i进行自减1运算。 二、经典题型 下列程序执行后输出结果是什么? main() {int a=100; printf(“a++=%d;”,a++);*/①/* printf(“++a=%d;”,++a);*/②/* printf(“a--=%d;”,a--);*/③/* }

C语言自增自减问题总结

C语言自增自減问题总结 在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C 语言为这种操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是单目运算符,是从右向左结合的算术运算符。学习和应用这两个运算符时应注意以下几点: 我将自增自减运算符和变量结合在一下的表达式称为自增自减表达式,如 x++,--I等。通常情况下就有以下的结论: 1‘’前缀表达式:++x, --x; 其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即“先变后用”,也就是变量的值先变,再用变量的值参与运算。 2、后缀表达式:x++, x--; 先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化,。 如a=8; b=a++; c=++a; 其中赋给变量b的值为表达式(a++)的值,不应该理解为a的值,则b=8, c=10; 3、自增、自减运算只能用于单个变量,只要是标准类型的变量,不管是整型、实型,还是字符型变量等,但不能用于表达式或常量。如:++(a+b), 与5++,const int N=0; N++; 等都是错误的。而i+++j++、++i+(++j)、++a+b++、++array [--j];等,这些都是合法的。 4、再说结合性与结合方向 编译器对程序编译时,从左到右尽可能多地将字符组合成一个运算符或标识符,因此i+++j++等效于(i++)+(j++),两个“++”作用的对象都是变量,这是合法的;而++i+++j等效于++(i++)+j,第1个“++”作用的对象是表达式 “i++”,这是不允许的。 自增自减运算符是单目运算符,其结合性是从右到左。表达式k=-i++等效于k=(-i)++还是k=-(i++)?。因为负号也是单目运算符,因此,上式从右到左结合,等效于k=-(i++);若i=5,则表达式k=-i++运算之后k的值为-5,i的值为6。此赋值表达式的值即为所赋的值-5。不要因为k=-i++等效于k=-(i++)

C语言自增自减运算符总结

C语言自增自减运算符总结 978299005@https://www.doczj.com/doc/475713128.html, 【例】 int i=5, j=5, p, q; p = (i++) + (i++); q = (++j) + (++j); printf("%d, %d, %d, %d\n", i, j, p, q); i=5; j=5; p = (i++) + (i++) + (i++); q = (++j) + (++j) + (++j); printf("%d, %d, %d, %d\n", i, j, p, q); i=5; j=5; p = (i++) + (i++) + (i++) + (i++); q = (++j) + (++j) + (++j) + (++j); printf("%d, %d, %d, %d\n", i, j, p, q); i=5; j=5; p = (i++) + (i++) + (i++) + (i++) + (i++); q = (++j) + (++j) + (++j) + (++j) + (++j); printf("%d, %d, %d, %d\n", i, j, p, q); 【讲解】 在VC6.0下编译,运行。 这段程序的运行结果是 7, 7, 10, 14 8, 8, 15, 22 9, 9, 15, 22 10, 10, 25, 41 可见a++这类运算,是整个式子算完以后,统计一下有几个++,再统一给a加上几。而

++a这类运算,在2个以下的时候,是先统计下有几个++,然后都加上去,然后再进行赋值。超过两个了,那么第三个开始,就是分步来,前两个算完了,第三个把前面得到的值拿来用。所以,q = (++j) + (++j) + (++j); (j=5)q就等于7+7+8=22. 总结一句话:vc环境中: ++i++i先使i的值自增两次再赋值! i++i++先赋值再使i的值自增两次! 【注意】 自增自减运算符的对象是变量,不是常量或表达式。如+ + i + + +j就不合法。这是因为C 语言的编译器对程序编译时,从左到右尽可能多地将字符组成一个运算符或标识符,因此+ + i + + +j 等效于+ + ( i + + ) + j , 第1 个“ + + ”作用的对象是表达式“i + + ” 这是不允许的。 【汇编的依据】 原理表达式中除了预算法本身的优先级外,还有一个结合性问题。在++j + ++j + ++j;中,因为存在两个同级的+运算,根据+运算符的左结合性,在编译时,其实是先处理前面的(++j + ++j)这部分,然后再将此结果再和++j相加。具体过程参见汇编代码: int b = ++j + ++j + ++j; 0040B7DD mov ecx,dword ptr [ebp-8] 0040B7E0 add ecx,1 0040B7E3 mov dword ptr [ebp-8],ecx // 第一个++j 0040B7E6 mov edx,dword ptr [ebp-8] 0040B7E9 add edx,1 0040B7EC mov dword ptr [ebp-8],edx // 第二个++j 0040B7EF mov eax,dword ptr [ebp-8] 0040B7F2 add eax,dword ptr [ebp-8] // ++j + ++j 0040B7F5 mov ecx,dword ptr [ebp-8] 0040B7F8 add ecx,1 0040B7FB mov dword ptr [ebp-8],ecx // 第三个++j 0040B7FE add eax,dword ptr [ebp-8] // ++j + ++j + ++j 0040B801 mov dword ptr [ebp-10h],eax // 赋值给b

C语言程序自增自减问题的几点思考

龙源期刊网 https://www.doczj.com/doc/475713128.html, C语言程序自增自减问题的几点思考 作者:郑英 来源:《数字技术与应用》2010年第10期 摘要:文章针对教学和各类考试中所遇到的C语言自增、减问题,从运算顺序、输出方式、编译器对自增减问题的影响出发,通过大量试验进行分析、论证问题源头,提出学生在学习和考试中对自增、减问题的认识态度。 关键词:C语言++--赋值混合运算 中图分类号:G642.4 文献标识码:A 文章编号:1007-9416(2010)10-0119-01 1 引言 自增、减一直是c语言中一个重要问题,也是大家讨论的热点。通常在c语言等考及相关的竞赛中,自增、减的嵌套使用,变量前后置自增、减,同一变量不同形式的自增、减四则运算等试题层出不穷,如:在进行ITAT C语言程序设计大赛的培训中,类似于int i=3;m=i+++i+++i++;求m的值的题目特别多。笔者在教学和各种考试中发现部分题目运算结果存在差异,针对疑问,对学习和考试中所遇到的自增、减问题进行大量分析与实验论证,总结了几点关于自增、减问题的思考。 2 基本知识 通常所说的自增、减是指操作数在自身的基础上增加1或者减少1,分为前后置两中情形。前置操作是指操作数先执行增1或减1运算,再参加其他操作;后置操作则是指操作数的值先进行其他操作,再对自身做增1、减1运算。一般应用在以下几种情况: (I).计数。常用于修改控制循环的变量,n++书写和阅读比n=n+1简便,生成的目标代码更短。(II).指针。操作对象是指针类型时,按照指针所指向的存储单元增1、减1操作。需要注意的是,增1、减1运算的操作对象只能是变量,因为增1、减1操作是将操作对象的值加1或者减1后送回存储单元,而常量、表达式等则无对应的存储单元。例如:++x和y++是合法的,++10、(i+j)++、(-i)++和(i++)++则是非法的。 3 问题分析及实例论证

java中的自增(++)和自减(--)运算符

有些运算符在JAVA语言中存在着,但是在实际开发中我们或许很少用到它们,在面试题中却时常出现它们的身影,对于这些运算符的含义和用法,你是否还记得呢? 自增(++)和自减(--)运算符 我们先来回答几个问题吧: Java代码 1.int i = 0; 2.int j = i++; 3.int k = --i; 这段代码运行后,i等于多少?j等于多少?k等于多少?太简单了?好,继续: Java代码 1.int i = 0; 2.int j = i++ + ++i; 3.int k = --i + i--; 代码执行后i、j、k分别等于多少呢?还是很简单?好,再继续: Java代码 1.int i=0; 2.System.out.println(i++); 这段代码运行后输出结果是什么?0?1? Java代码 1.float f=0.1F; 2.f++; 3.double d=0.1D; 4.d++; 5.char c='a'; 6.c++; 上面这段代码可以编译通过吗?为什么?如果你能顺利回答到这里,说明你对自增和自减运算符的掌握已经很好了。 为了分析出上面提出的几个问题,我们首先来回顾一下相关知识:

?自增(++):将变量的值加1,分前缀式(如++i)和后缀式(如i++)。 前缀式是先加1再使用;后缀式是先使用再加1。 ?自减(--):将变量的值减1,分前缀式(如--i)和后缀式(如i--)。 前缀式是先减1再使用;后缀式是先使用再减1。 在第一个例子中,int j=i++;是后缀式,因此i的值先被赋予j,然后再自增1,所以这行代码运行后,i=1、j=0;而int k=--i;是前缀式,因此i先自减1,然后再将它的值赋予k,因此这行代码运行后,i=0、k=0。 在第二个例子中,对于int j=i++ + ++i;,首先运行i++,i的值0被用于加运算(+),之后i自增值变为1,然后运行++i,i先自增变为2,之后被用于加运算,最后将i两次的值相加的结果1+2=3赋给j,因此这行代码运行完毕后i=2、j=2;对于int k=--i + i--;用一样的思路分析,具体过程在此不再赘述,结果应该是i=0、k=2。 自增与自减运算符还遵循以下规律: 1.可以用于整数类型byte、short、int、long,浮点类型float、double, 以及字符串类型char。 2.在Java5.0及以上版本中,它们可以用于基本类型对应的包装器类Byte、 Short、Integer、Long、Float、Double、Character。 3.它们的运算结果的类型与被运算的变量的类型相同。 下面的这个例子验证以上列出的规律,它可以编译通过并执行。 Java代码 1.public class Test { 2. public static void main(String[] args) { 3. // 整型 4. byte b = 0; 5. b++; 6. // 整型 7. long l = 0; 8. l++; 9. // 浮点型 10. double d = 0.0; 11. d++; 12. // 字符串 13. char c = 'a'; 14. c++; 15. // 基本类型包装器类 16. Integer i = new Integer(0); 17. i++;

C语言程序设计(自增、自减运算符)

3.2.2自增、自减运算符 在循环结构中会经常碰到某一个变量加1再赋给变量本身的情况,如引例的i=i+1。在c语言中有专门的运算符来表示这种情况,该运算符称为自增运算符,形式为++,含义是使变量自加1,如i++表示的含义是变量i加1再赋给本身,即i++等价于i=i+1,但前者的执行效率高于后者,跟自增运算符类似的还有自减运算符,形式为--,如i--表示变量i减1再赋给本身,即i--等价于i=i-1。 自增自减运算符是单目运算符,它们只能作用于变量。i++和++i的区别是:i++是i 参与运算后i的值再自增1(即:先引用i,然后i的值再增1),而++i是i自增1后再参与其它运算(即:先使i的值增1,然后再引用i,)。 例如:设i的初值为5,执行完j=i++后j的值为5,i的值为6,而如果i的初值为5,执行完j=++i;后j的值为6,i的值为6。关于i--和--i的区别同此类似。 注意:自增自减运算符不能作用于常量和表达式,比如:7++和--(a+b)都为错误表达式。 【例3-10】自增自减运算符的使用 /*程序名:3_10.c*/ /*功能:自增自减运算符的使用*/ #include int main() { int i=8; printf("%d,",++i);/*打印自加后的值*/ printf("%d,",--i);/*打印自减后的值*/ printf("%d,",i++);/*先打印原值,后自加*/ printf("%d,",i--);/*先打印原值,后自减*/ printf("%d,",-i++);/*先取原值,做负运算并打印,再自加*/ printf("%d\n",-i--);/*先取原值,做负运算并打印,再自减*/ return0; } 该程序的运行结果为: 9,8,8,9,-8,-9

C语言中多个自增自减的运算规律-文档资料

C语言中多个自增自减的运算规律 C语言中有两个很奇特的单目运算符:++(自增运算符)和--(自减运算符),自增运算符和自减运算符都有前缀式和后缀式。这两个运算符在C语句中,尤其是循环语句中使用较为广泛,对于单个的自增运算符或自减运算符,相信大家都易于理解。但是,C语言允许在一个表达式中使用一个以上的自增运算符、自减运算符,这种灵活性使程序简洁,但同时也会引起副作用。这种副作用主要表现在:使程序费解,并易于发生误解或错误。例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一或者干脆回避这类问题。既然前面提到在一个表达式中可以有多个自增或自减运算符,我们不能总是以费解或避免出错为由来回避这个问题,不用归不用,了解一下这些内容还是相当有必要的。为了弄清楚C语言中多个自增或自减运算符的运算规律,笔者经查阅大量资料并反复上机验证,总结出在VC++6.0环境下多个自增自减的运算规律。 1 连续多个后缀的运算规律 先统一取值后依次自增或自减。如: #include void main() { int a,i=5;

a=(i++)+(i++)+(i++); printf(“a=%d,i=%d\n”,a,i); } 其运算规律是先对所有的i++统一取值5,然后i依次自增3次,即 a=5+5+5=15,i=5+1+1+1=8。 因此,程序输出结果为:a=15,i=8 2 连续多个前缀的运算规律 前两个连续的前缀(两个连续自增,或者两个连续自减,或者一个自增一个自减),即依次自增(减)后,统一取第二个自增(减)的值,后面的每个自增(减)后即刻取值。如:#include void main() { int a, i=5; a= (++i)+(++i)+(++i); printf(“a=%d,i=%d\n”,a,i); } 第一个++i的值为6,第二个++i的值为7,第三个++i的值为8,但第一个++i和第二个++i统一取第二个++i的值7,即a=7+7+8=22,而i的值则依次自增,即i=5+1+1+1=8。 因此,程序输出结果为:a=22,i=8 同理,我们再看一个稍复杂的例子:

C语言自增自减习题

自增自减练习题 1、下列关于单目运算符++、--的叙述中正确的是( ) A)它们的运算对象可以是任何变量和常量 B)它们的运算对象可以是char型变量和int型变量,但不能是float型变量 C)它们的运算对象可以是int型变量,但不能是double型变量和float型变量 D)它们的运算对象可以是char型变量、int型变量和float型变量 2、设有以下定义 int a=0; double b=1.25; char c=’A’; #define d 2 则下面语句中错误的是( ) A) a++; B) b++; C) c++; D) d++; 3、以下选项中,与k=n++完全等价的表达式是( ) A) k=n,n=n+1 B) n=n+1,k=n C) k=++n D) k+=n+1 4、设正x、y均为整型变量,且x=10 y=3,则以下语句的输出结果是( ) printf("%d,%d\n",x--,--y); A) 10,3 B) 9,3 C) 9,2 D)10,2 5、设有int x=11; 则表达式(x++ * 1/3) 的值是( ) A) 3 B) 4 C) 11 D) 12 6、以下程序的输出结果是( )。 #include voidmain() {inti=010 ,j = 10; printf("%d,%d\n",+ +i , j - -); } A) 11,10 B) 9,10 C) 010,9 D) 10,9 7、有以下程序 #include voidmain() {int m=12,n=34; printf("%d%d",m++,++n); printf("%d%d\n",n++,++m);

C语言自增自减运算符深入剖析

发布日期:来源:作者: 引子 语言地自增,自减运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题: <> () *主函数* { ; ; ; ()()(); ()()(); ("\"); } 结果是什么? 而后搜了一下后发现,类似地问题很多,也就是说对自增自减运算符感到迷惑是一个普遍存在地问题,基于此,决定对自增自减运算符做个小小地解析,希望能给语言爱好者们提供参考,解决对此问题地困惑. 自增自减运算符语法 自增运算符使操作数地值加,其操作数必须为可变左值(可简单地理解为变量).对于自增就是加这一点,想大家都不会有什么疑问. 问题在于:可以置于操作数前面,也可以放在后面,如: ; ; 表示,自增后再参与其它运算;而则是参与运算后,地值再自增. 自减运算符与之类似,只不过是变加为减而已,故不重述. 实例剖析 下面我们通过一些实例来深入理解自增运算符地特性,自减运算符同理自悟 例一: ; ; ; ; (", \", , ); 对此,想大家都不会有什么困惑,结果就是,;下面我们来做一点小改动:

; ; ; ; (", \", , );结果又是多少呢?这里就开始体现出前置与后置地区别了,结果是,.结合此例,我们回头再来理解一下“前置:自增后再参与其它运算;后置:参与运算后,地值再自增”.很明显,;由于是先执行赋值运算,再自增,所以结果是=,=;而;则因先自增,然后再赋值,所以,均为. 其实基本道理就这么简单了,但在更复杂点地情况下又会如何呢,请看: 例二: ; ; ; ; (", \", , ); 问题又来了,是先自增一次,相加,再自增,然后赋值呢,还是先相加赋值然后自增两次呢.另外,++又将如何表现呢? 结果是:, 这下明白了,原来地理解应该是执行完整个表达式地其他操作后,然后才自增,所以例子中地=+=;而后再自增次,=;相反,是先自增然后再参加其它运算,所以=+=. 到此,是否就彻底明了了呢?然后回到引子中地问题: 例三: ; ; ; ; (", \", , ); 有人可能会说,这很简单,我全明白了:=++=,=,=++=,=.真地是这样吗? 结果却是:, 这下可好,又糊涂了.对于;我们已经没有疑问了,后置就是执行完整个表达式地其他操作后,然后才自增,上例中也得到了验证,但;又该如何理解呢? 原理表达式中除了预算法本身地优先级外,还有一个结合性问题.在;中,因为存在两个同级地+运算,根据+运算符地左结合性,在编译时,其实是先处理前面地()这部分,然后再将此结果再和相加.具体过程参见汇编代码:

相关主题
文本预览
相关文档 最新文档