搜档网
当前位置:搜档网 › C语言中的自加自减运算-最新资料

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

C语言中的自加自减运算-最新资料
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--);*/③/*

}

当程序执行到①时,输出表达式a++,由于自加符++后置,故先输出a的值100,然后a自加1,即执行完①后输出

“a++=100”,a的值是101。

当程序执行到②时,输出表达式++a,由于自加符++前置,故a先自加1变为102,然后输出a的值102,即执行完②后输出“++a=102”,a的值是102。

当程序执行到③时,输出表达式a--,由于自加符--后置,故先输出a的值102,然后a自减1,即执行完③后输出

“a--=102”,a的值是101。

综上所述,程序输出结果为:

a++=100;++a=102;a--=102

小结:该题目只要深刻领会++(--)运算在运算符前置和后置时,对其参与的其它运算(操作)的处理时机是不同的,前置时先进行自加1(自减1)运算,再进行其它运算(操作),后置时先参与其它运算(操作),再进行自加1(自减1)运算。

三、深度解析

1. 分析下列程序执行后的输出结果

#include

main(){

int i =1,j=2, p=0,q=0 ;

printf(“%d,%d,%d,%d”, p+i , j++ , q+j ,-- i );*/⑤/*

}

很多同学分析:在程序执行到⑤时 p+i输出1(0+1=1);j++输出2(j=2),j=2+1=3 ;q+j输出3(0+3=3);--i输出0(1-1=0)。得到的结果是:1 ,2 ,3 ,0 。然而上机运行的结果却是:0 ,2 ,2 ,0 ,这是为什么呢?原来,turboC 在printf()函数中,处理表达式列表的顺序是从右到左进行的,如果在表达式列表中不包含自加(自减)运算,从哪边开始处理数据都不会影响运算结果,但是,如果表达式列表中包含了自加(自减)运算,这个“处理数据的顺序”就会影响到数据的运算结果。正确的做法是先处理―i,输出0(1-1=0);其次是q+j,输出2(0+2=2);再次是j++,输出2(j=2,执行j++后j=3);最后是p+i,输出0(0+0=0),处理完毕后按原来顺序输出结果:0,2,2,0 。

结论:turboC在printf(“字符串”,表达式列表)函数中,处理表达式列表的顺序是从右到左进行的,如果在表达式列表中包含自加(自减)运算,运算起来就要十分细心。

2.分析如下程序输出结果:

#include

main(){

int i=5,j=5,p,q;

p=(i--)+( ++ i)+(i++);*/ ⑥/*

q=(++j)+( j++);*/ ⑦/*

printf(“%d,%d,%d,%d”,p,q,i,j);

}

严格的讲,程序中⑥、⑦中的表达式是不符合C语言语法规范的。尽管如此,但在实际当中,我们仍会经常碰到类似的题目,而且这些题目在机器上运行也会有特定的结果,因此在这里我仍然想探讨一下其解法。

笔者经过反复推敲,找到了一种解决这类问题的办法,并在实际应用中与机器执行的结果符合的很好。

我的思路是:将⑥或⑦中右侧表达式的运算分为3类:前置(自加或自减)运算、后置(自加或自减)运算和加(减)法运算,首先要进行的是前置运算,其次执行加(减)法运算,最后执行后置运算。如(i--)+( ++ i)+(i++),其中中间的自加运算为前置运算,其前后的自减运算和自加运算都是后置运算,首先进行前置运算,即++i,执行后i=5+1=6;然后执行加法运算,即3个i相加;结果为6+6+6=18,最后执行后置运算,即i=6+1-1=6 。所以题目中p=18,i=6。同理(++j)+( j++)中++j为前置运算,j++为后置运算,先进行前置运算j=5+1=6;然后执行加法运算,即2个j相加6+6=12;最后进行后置运算j=6+1=7 。所以题目中q=12,j=7,程序最后运行结果为:18,12,6,7 。以上方法可扩展到任何含有自加(自减)运算的运算表达式中。

四、结论

当一个表达式中含有多个自加(自减)运算时,可将运算分为前置运算、后置运算和其它运算,按照先执行前置运算,然后执行其它运算,最后执行后置运算的法则,可得到正确的运算结果。

对C语言的教学而言,能让学生理解到以上的深度,我认为教学的任务就完成了,至于更深层次的研究就是他们以后的事了,希望本文能给广大C语言教学工作者带来便利!

关于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语言中的运算符总结解读

C语言中的运算符总结 C语言中的操作符:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。 1.算术操作符:+ - * / % 1除了% 操作符之外,其他的几个操作符均可以作用于整数和浮点数。 2对于/ 操作符,如果两个操作数都为整数,执行整数除法;而只要有浮点数执行的就是浮点数除法。 3% 操作符的两个操作数必须为整数,返回的是整除之后的余数。 2.移位操作符: << 左移操作符和 >> 右移操作符(针对二进制位、是对整数的操作 1左移操作符移位规则:左边丢弃、右边补0。 2右移操作符移位规则:(1算术移位:左边补符号位,右边丢弃。 (2逻辑移位:左边补0,右边丢弃。 注:对于移位运算符,不能移动负数位,这个是标准未定义的。 3.位操作符:& 按位与 | 按位或 ^ 按位异或(操作数都必须是整数,是针对二进制数的操作 4.赋值操作符:= 可以重新为变量赋值(赋值操作符是可以连续使用的,从右向左执行,不建议使用。 5.复合赋值符:+= = *= /= %= >>= <<= &= |= ^= 6.单目操作符:! 逻辑反操作(真---假

- 负值+ 正值 & 取地址从内存中取地址,不能从寄存器register 中取址。 sizeof 操作数的类型长度(以字节为单位 ~ 一个数的二进制按位取反 -- 前置、后置-- ++ 前置、后置++ (1前置++和--:先自增后使用,表达式的值是自增之后的值。 先自减后使用,表达式的值是自减之后的值。 (2后置++和--:先使用再自加。 先使用再自减。 * 间接访问操作符(解引用操作符 (类型强制类型转换 7.关系操作符:> >= < <= != 不相等 == 相等 注:== 相等 = 赋值,二者易混淆,需注意。 8.逻辑操作符:&& 逻辑与|| 逻辑或 注:逻辑与、逻辑或是判断真假的,按位与、按位或是对二进制数进行操作的。 对逻辑与操作,只要有一个为假,便不必再进行后边的计算;对逻辑或操作,只要有一个为真,便不必再进行后边的操作。 9.条件操作符(三目操作符:exp1 ? exp2 : exp3 先计算表达式1 的值,如果表达式1 为真,整个表达式的值就是表达式 2 的值,如果为假,整个表达式的值就是表达式 3 的值。

计算机二级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

(完整word版)C语言运算符与表达式的练习题答案

C语言运算符与表达式的练习题 单项选择题 (1)以下选项中,正确的 C 语言整型常量是(D)。 A. 32L B. 510000 C. -1.00 D. 567 (2)以下选项中,(D)是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3)字符串的结束标志是(C)。 A. 0 B. '0' C. '\0' D. "0" (4)算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (5)逻辑运算符中,运算优先级按从高到低依次为(D)。 A. && ! || B. || && ! C. && || ! D. ! && || (6)表达式!x||a==b 等效于(D)。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (7)设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是(A)。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 *(8)设有语句 int a=3;,则执行了语句 a+=a-=a*=a; 后,变量 a 的值是(B)。 A. 3 B. 0 C. 9 D. -12 (9)在以下一组运算符中,优先级最低的运算符是(D)。 A. * B. != C. + D. = (10)设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B,上机13)。 A. 6 B. 12 C. 15 D. 表达式出错 (11)若已定义 x 和 y为double 类型,则表达式的值是(D)。

C语言运算符大全 (2)

C语言运算符大全C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C 语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。 最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1 操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x;

此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级: :最高++、- -- -(一元减) *、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言 处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。 关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。关系和逻辑运算符概念中的关键是True(真)和Flase(假)。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。 表2-6给出于关系和逻辑运算符,下面用1和0给出逻辑真值表。关系和逻辑运算符的优先级比算术运算符低,即像表达式10>1+12的计算可以假定是对表达式10>(1+12)的计算,当然,该表达式的结果为Flase。在一个表达式中允许运算的组合。例如: 10>5&&!(10<9)||3<=4 这一表达式的结果为True。

C语言数据类型和运算符及表达式复习题

数据类型、运算符和表达式复习题.选择题 1. 以下不合法的用户标识符是: ( ) a) f2_G3 b) If c) 4d d) _8 2. 以下选项中合法的用户标识符是: ( ) a) long b) _2Test c) 3Dmax d) A.dat 3. 以下可用作用户标识符的是: ( ) a) 12_a b) signed c) t-o d) _if 4. 以下不是关键字的标识符是: ( ) a) continue b) char c) If d) default 5. C 语言提供的合法的关键字是: ( ) a) swicth b) cher c) Case d) void 6. 以下选项中不合法的int 整型常数是( ) a) 32768 b) -56 c) 03 d) 0xAF 7. 以下合法的长整型常量是( ) a) 2L b) 49627 c) d) 213& 8. 以下正确的实型常量是( ) a) 1.2E b) . c) 1.2e0.6 d) 8 9. 以下选项中合法的实型常数是( ) a) 5E2.0 b) E-3 c) .2E0 d) 1.3E 10. 以下合法的八进制数是( ) a) 0135 b) 068 c) 013.54 d) o7

11. 以下合法的十六进制数是( ) a) 0x b) 0x4de c) 0x1h d) ox77 12. 以下选项中非法的数值常量是( ) a) 019 b) 0L c) 0xff d) 1e1 13. 若变量已正确定 以下合法的赋值表达式是( ) 义, a) a=1/b=2 b) ++(a+b) c) a=a/(b=5) d) y=int(a)+b 14. 若变量已正确定 以下非法的表达式是( ) 义, a) a/=b+c b) a%(4.0) c) a=1/2*(x=y=20,x*3) d) a=b=c 15. 设x为int 类型,其值为11,则表达式( x++*1/3 )的值是: a) 3 b) 4 c) 11 d) 12 16.设a,b 均为double 型,且 a=5.5;b=2.5; 则表达式 (int)a+b/b 的值是( ) a) 6. b) 6 c) 5. d) 6. 17.若a为int型,且其值为3,则执行完表达式: a+=a-=a*a 后,a 的值是( ) a) -3 b) 9 c) -12 d) 6 18.设k 和x 均为int 型变量,且k=7 ;x=12;则能使值为 3 的表达式是( )

c语言34种运算符

C语言运算符 算术运算符 TAG:运算符,数据类型 TEXT:算术运算符对数值进行算术运算,其中:加、减、乘、除、求余运算是双目运算。其结果可以是整数、单精度实数和双精度实数。自增、自减运算是单目运算,其操作对象只能使整型变量,不能是常量或表达式等其他形式。 REF:.TXT,+运算符.txt,-运算符.txt,*运算符.txt,/运算 符.txt,%运算符,++运算符,--运算符 加+ TAG:算术运算符,运算符,数据类型 TEXT:双目运算符,算数加法。单目运算符,表示正数。REF:.TXT,算数运算符.txt 减- TAG:算术运算符,运算符,数据类型 TEXT:双目运算符,算数减法。单目运算符,表示负数。REF:.TXT,算数运算符.txt 乘* TAG:算术运算符,运算符,数据类型 TEXT:*,双目运算符,算数乘法。 REF:.TXT,算数运算符.txt

除/ TAG:算术运算符,运算符,数据类型 TEXT:/,双目运算符,算数除法;如果两个参与运算的数是整数,表示整除,舍去小数部分。 如5.0/2等于2.5,而5/2等于2。 REF:.TXT,算数运算符.txt 取余% TAG:算术运算符,运算符,数据类型 TEXT:/,双目运算符,算数除法;如果两个参与运算的数是整数,表示整除,舍去小数部分。 如5.0/2等于2.5,而5/2等于2。 REF:.TXT,算数运算符.txt 自加++ TAG:算术运算符,运算符,数据类型 TEXT:单目运算符,针对整数运算,可以放在运算数的两侧,表示运算数增1。 REF:.TXT,算数运算符.txt 自减-- TAG:算术运算符,运算符,数据类型 TEXT:单目运算符,针对整数运算,可以放在运算数的两侧,表示运算数减1。

C语言程序设计实验报告实验数据类型运算符和表达式

凯里学院C 语言程序设计实验报告 ×××××专业××年级××班,学号××××××姓名××成绩 合作者实验日期年月日 指导教师评阅日期年月日 实验二数据类型、运算符和表达式 一、实验目的: (1)掌握C 语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。 (2)学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C 语言的输入和输出函数的使用 (4)进一步熟悉C 程序的编辑、编译、连接和运行的过程,学会使用stepbystep 功能。 (5)认真阅读教材数据类型,算术运算符和表达式,赋值运算符和表达式部分内容。 二、实验内容: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; 装 订 线 装 订 线

printf("%c%c\n",c1,c2); } (2)按习题3.7的要求编程序并上机运行 该题的要求是: 要将“China”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。 例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre"。 请编一程序,用赋初值的方法使。cl,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使cl,c2,c3,c4,c5分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。 三、实验步骤: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; printf("%c%c\n",c1,c2); } ①运行此程序。 程序结果为:

C语言运算符大全

C语言运算符大全 C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 2.6.1算术运算符 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。 最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 2.6.2自增和自减 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x; 此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级: :最高++、- -- -(一元减) *、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言 处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。 2.6.3关系和逻辑运算符 关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。关系和逻辑运算符概念中的关键是True(真)和Flase(假)。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。

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语言数据类型与表达式习题及答案

第一章数据类型,运算符与表达式 一.选择题 1.不合法的常量是A。 A)‘/2’B) “”C)‘’D)“483” 2. B 是C语言提供的合法的数据类型关键字。 A)Float B)signed C)integer D)Char 3.在以下各组标识符中,合法的标识符是(1)A,(2) C ,(3) D 。 (1)A)B01 B)table_1 C)0_t D)k% Int t*.1 W10 point (2)A)Fast_ B)void C)pbl D) Fast+Big abs fabs beep (3)A)xy_ B)longdouble C)*p D)CHAR 变量1 signed history Flaut 4. 不属于合法的C语言长整型常量的是 C 。 A)5876273 B)0L C)2E10 D)(long)5876273 7.下面选项中,均是合法浮点数的是 B 。 A)+1e+1 B)-0.60 C)123e D)-e3 5e-9.4 12e-4 1.2e-.4 .8e-4 03e2 -8e5 +2e-1 5.e-0 8.在C语言中,要求参加运算的数必须是整数的运算符是 C 。 A)/ B)* C)% D) = 9.在C语言中,字符型数据在内存中以 D 形式存放。 A)原码B)BCD码C)反码D)ASCII码10.下列语句中,符合语法的赋值语句是 C 。 A)a=7+b+c=a+7;B)a=7+b++=a+7; C)a=7+b,b++,a+7;D)a=7+b = c=a+7; 11. B 是非法的C语言转义字符。 A)‘\b’B)‘\0xf’C)‘\037’D)‘\’’12.对于语句:f=(3.0,4.0,5.0),(2.0,1.0,0.0);的判断中, B 是正确的。 A)语法错误B)f为5.0 C)f为0.0 D)f为2.0 13.与代数式x y u v ? ? 不等价的C语言表达式是A。 A)x*y/u*v B)x*y/u/v C)x*y/(u*v) D)x/(u*v)*y 14.在C语言中,数字029是一个 D 。 A)八进制数B)十六进制数C)十进制数D)非法数 16.对于char cx=?\039?;语句,正确的是A。 A)不合法B)cx的值是?\03? C)cx的值为四个字符D)cx的值为三个字符 17.若int k=7,x=12;则能使值为3的表达式是 D 。 A)x%=(k%=5) B)x%=(k-k%5) C)x%=k-k%5 D)(x%=k)-(k%=5) 18.为了计算s=10!(即10的阶乘),则s变量应定义为 C 。 A)int B)unsigned C)long D)以上三种类型均可

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

C语言自增自减运算符总结 978299005@https://www.sodocs.net/doc/463312855.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语言题库第2章 数据类型运算符和表达式√

第二章数据类型运算符和表达式 一、单项选择 1.若有定义语句:int k1=10,k2=20;,执行表达式(k1=k1>k2)&&(k2=k2>k1)后,k1和k2的值分别为( B ) 2.下面四个选项中,均是不合法的用户标识符的选项是( B )。 3.判断字符型变量c1是否为数字字符的正确表达式为( A ) 4.在C语言中,要求运算数必须是整型的运算符是( A )

5.下面四个选项中,均是合法的用户标识符的选项是(A)。 6.假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)的值是(B)。 7.若x,i,j和k都是int型变量,则计算表达式x=(i=4,j=16,k=32)后,x的值为(B)。

8.表达式18/4*sqrt(4.0)/8值的数据类型为(B)。 9.若a是数值类型,则逻辑表达式(a==1)||(a!=1)的值是( D ) 10.判断字符型变量c1是否为小写字母的正确表达式为(B)。

11.在C语言中,char型数据在内存中的存储形式是(C)。 12.以下选项中关于C语言常量的叙述错误的是:( D ) 13.下面正确的字符常量是(B)

14.C语言中的标识符只能由字母、数字和下划线三种字符组成,且第一个字符( D) 15.以下选项中,能表示逻辑值"假"的是( B ) 16.设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的数据类型为(C)

17.以下选项中非法的字符常量是( B ) 18.以下关于C语言数据类型使用的叙述中错误的是(B ) 19.设:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b) && (n=c>d)后n的值为(C)。

掌握C语言中基本的运算符

第3讲 运算符运算符、、表达式&类型转换 【课前思考课前思考】】 1、回忆数学中的运算符回忆数学中的运算符、、表达式表达式,,C 语言中的运算符语言中的运算符、、表达式是什么样子表达式是什么样子?? 2、能否直接将一个浮点型数据赋值给整型变量能否直接将一个浮点型数据赋值给整型变量?? 【学习目标学习目标】】 掌握C 语言中基本的运算符、表达式,掌握C 语言中数据类型转换的方法 【学习指南学习指南】】 联想数学中的运算符及表达式,找出C 语言与其区别进行学习 【重 难 点】 重点: 算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符及其优先级 “=”与“==”的区别 难点: 自增、自减运算,逻辑运算,逗号运算 【学时安排学时安排】】 学时:2学时 【知 识 点】 第3讲 运算符、表达式&类型转换 (1) 2.3 运算符与表达式 (2) 2.3.1 算术运算符与算术表达式....................................................................................2 1. 算术运算符.................................................................................................................2 2. 算术表达式.................................................................................................................3 2.3.2 自增与自减运算....................................................................................................4 1. 自增、自减运算符的使用形式.................................................................................4 2. 自增、自减运算符的优先级和结合性....................................................................5 2.3.3 关系运算符与关系表达式....................................................................................5 1. 关系运算符.................................................................................................................5 2. 关系表达式.................................................................................................................6 2.3.4 逻辑运算符与逻辑表达式....................................................................................6 1. 逻辑运算符.................................................................................................................6 2. 逻辑表达式.................................................................................................................7 2.3.5 赋值运算符与赋值表达式....................................................................................8 2.3.6 条件运算符与求字节运算符................................................................................9 1. 条件运算符.................................................................................................................9 2. 求字节运算符.. (10)

逻辑运算符和表达式(c语言)

南京高等职业技术学校 课堂教学设计 授课时间:2014年11月6日第11周星期四教学目标教学准备 授课教师课时课程通过本节课的学习,学生能够: 1.清晰地说出各种逻辑运算符; 2.正确运算出逻辑表达式的值,并 通过程序验证结果; 重点教案□√ 马丽娟 1 C语言多媒体课件□√班级授课地点课题教学讲义□ 512212 机房4.2逻辑运算符与逻辑表达 式 1.逻辑表达式的求值运算; 2.逻辑表达式的求值优化。 学生工作页□ 课堂特殊要求(指教师、学生的课前准备活动等) 教师:安装Win-TC程序难点 教具□√ 逻辑表达式的求值优化授课形式 理论讲授课 教学环节时间分配教师活动学生活动教学方法媒体手段导入新课 5 提出问题,并举例说明听讲、思考、回答讲授法PPT 新课讲授20 讲授、分析听讲、讨论并记录讲授法PPT 巩固练习15 布置任务、巡视、答疑思考、编程并回答问题练习法Win-TC 课堂小结 3 归纳、总结听讲、回答问题讲授法PPT 布置作业 2 布置作业记录讲授法PPT 板书设计 §4.2 逻辑运算符与逻辑表达式 ?逻辑运算符:&&、||、! ?逻辑表达式的值:非0即1 ?逻辑运算的求值优化工作任务/教学情境设置 无课后作业 书面作业:P52 随堂练习 课后反思

教案纸 教学内容 4.2 逻辑运算符与逻辑表达式 一、复习导入(5min) 1. 复习:请学生说出关系运算符有哪些? 请学生回答关系运算表达式的值? 教师进行补充。 2.导入新课: 1、学生参加技能大赛培训的条件? ?扎实的专业知识与较高的实践能力 教师强调与的关系 2、参加技能大赛集训而停课的条件? ?移动互联或智能家居 教师强调或的关系 3、学生回答引入禁烟区的条件? ?没有吸烟非 教师强调非的关系 二、新课讲授(20min) 逻辑运算符 1.教师根据逻辑关系给出三种逻辑运算符的表示形式: &&、||、! 2.教师利用具体的表达式关系分析各种逻辑运算符的作用: 逻辑与相当于英语中的and; 逻辑或相当于英语中的or; 逻辑非相当于英语中的no; 3.教师根据具体的逻辑关系引出逻辑表达式的概念及表示形式: 表达式1&&表达式2 a&&b 表达式1||表达式2 a || b !表达式!a

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

龙源期刊网 https://www.sodocs.net/doc/463312855.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 问题分析及实例论证

相关主题