4.1用何种方法可以快速找出字符$的 ASCII码? 答: printf("ASCI($)=%dn",(int)$’) 4.2写出4个不同的表达式,它们分别将整型变量n减去1。 答 、 4.3构造一个逻辑表达式来表示以下条件 a. score大于等于80但小于90 b.n在0到9之间,但不是偶数 c.n能被3整除,但不能被30整除 d.ch是一个小写字母或大写字母 E: a.(score >=80&& score0&&n=A'&&ch='a’&&ch0?x;-x) 4.5使用条件运算符实现:如果变量 count>100,则输出" too many"。 X: printf (%s\n", count>100? too many": 4.6构造一个表达式,对给定的两个整数m和n,根据其中的一个是否是另一个的 倍数,打印出“ multiple”或“not”。 A: printf ("%s\n", m %n ==0|In %m==0? "multiple":"not ") 4.7请给出逻辑运算|和&的短路性质 答:如果表达式的值能根据其左操作数便可确定,它就不再对其右操作数求值。 4.8设有定义: unsigned int a =10 int b =-20 则执行下面的语句,输出结果是什么? (a+b>10)? printf(">10n"): printf("10。 49设a=11,b=22,c=33;下面的表达式计算后,y,a,b,c的值分别是多少? y=a<bl|(b=0)&&(c=0) /*赋值运算* 答:y=1,a=11,b=22 4.10何谓左值表达式?何谓右值表达式? 答:左值表达式是一个其值为可存储地址值的表达式,右值表达式是一个可求值的表 达式 4.11下面这段代码可能存在什么问题?给出你的改进方案。 inta=5000; int b= 20 答:在32位机上应该没有问题,但在16位机上,乘法运算的结果将溢出,这样c得 到的不是a*b的积,这说明移植性差。一种解决方案是: long c=(long a*b
4.1 用何种方法可以快速找出字符’$’的 ASCII 码? 答: printf("ASCII($) = %d\n",(int)’$’); 4.2 写出 4 个不同的表达式,它们分别将整型变量 n 减去 1。 答: n = n-1 n- = 1 --n n— 4.3 构造一个逻辑表达式来表示以下条件: a.score 大于等于 80 但小于 90; b.n 在 0 到 9 之间,但不是偶数; c.n 能被 3 整除,但不能被 30 整除; d.ch 是一个小写字母或大写字母。 答:a.(score >= 80 && score 0 && n = ’A’ && ch = ’a’ && ch 0 ? x; -x); 4.5 使用条件运算符实现:如果变量 count > 100,则输出"too many"。 答:printf("%s\n",count > 100 ?"too many":""); 4.6 构造一个表达式,对给定的两个整数 m 和 n,根据其中的一个是否是另一个的 倍数,打印出“multiple”或“not”。 答:printf("%s\n", m % n == 0||n % m == 0 ?" multiple ":" not "); 4.7 请给出逻辑运算||和&&的短路性质。 答:如果表达式的值能根据其左操作数便可确定,它就不再对其右操作数求值。 4.8 设有定义: unsigned int a = 10; int b = -20; 则执行下面的语句,输出结果是什么? (a + b > 10)? printf(">10\n"):printf( "10。 4.9 设 a = 11,b = 22,c = 33;下面的表达式计算后,y,a,b,c 的值分别是多少? y = a < b||(b = 0)&&(c = 0) /*赋值运算*/ 答:y = 1,a = 11,b = 22,c = 33。 4.10 何谓左值表达式?何谓右值表达式? 答:左值表达式是一个其值为可存储地址值的表达式,右值表达式是一个可求值的表 达式。 4.11 下面这段代码可能存在什么问题?给出你的改进方案。 int a = 5000; int b = 20; long c = a * b; 答:在 32 位机上应该没有问题,但在 16 位机上,乘法运算的结果将溢出,这样 c 得 到的不是 a*b 的积,这说明移植性差。一种解决方案是: long c = (long)a*b;
4.12有哪些运算符,它们可以对整个表达式的求值顺序施加控制(即与优先级无关) 请分别说明它们的特性 答:有4个,它们是:||,&,?:和逗号","。前三种按子表达式从左至右求值,可 能使某个子表达式被完全跳过不再求值:逗号运算符保证前一个子表达式的求值过程全部 结束在到达后一个子表达式之前。 4.13请给出下面表达式两种可能的求值顺序: 答:一种可能的求值顺序是 另一种可能的求值顺序是: (a*b) (a*b)-(c*d)+(e*f) (a*b)-(c*d)+(e*f) 4.14哪些运算符具有副作用?它们具有什么样的副作用? 答:++,一:无论是前缀还是后缀,它们都会更新它们的操作数, 及复合赋值:它们都更新作为左值的左操作数。 4.15下面这个表达式的类型和值是什么? ( float)(20/6) 答:类型是 float,其值为3.0。 4.16为什么说,一个程序如果使用了有符号数的右移位运算,它就是不可移植的? 答: ANSI C规定:对无符号数而言,所有的移位运算都是逻辑移位:对于有符号数, 是采用逻辑移位还是算术移位,取决于编译器。我们知道,在移位运算中,对任意的数 算术左移和逻辑左移其结果是一样的。它们只有在右移时不同,而且只有当操作数是负数 时才不一样。由于 ANSI C对右移的行为没有定义,所以当操作数为负数执行右移时,其值 是不确定的。因此,该程序是不可移植的 4.17移位运算中,移位次数可以为负数吗? 答: ANSI C说明这类移位的行为是未定义的,因而它的结果是不可预测的。基于这个 原因,移位次数应定义为无符号类型。 4.18计算下列各表达式的值。如果某个表达式具有副作用(它更新了一个或多个变量 的值),请标注它们。在计算每个表达式时,每个变量所使用的是开始时给出的初始值,而 不是前一个表达式的结果。设变量的初始化如下 inta=10,b=-25 intc=0,d=3,e=20 b.a/6 d.bc+ta>b a Ox b&0x1 k. a b<< a& b
4.12 有哪些运算符,它们可以对整个表达式的求值顺序施加控制(即与优先级无关), 请分别说明它们的特性。 答:有 4 个,它们是:||,&&,?:和逗号","。前三种按子表达式从左至右求值,可 能使某个子表达式被完全跳过不再求值;逗号运算符保证前一个子表达式的求值过程全部 结束在到达后一个子表达式之前。 4.13 请给出下面表达式两种可能的求值顺序: a*b – c*d + e*f 答:一种可能的求值顺序是: 另一种可能的求值顺序是: a*b c*d c*d e*f (a*b)–(c*d) a*b e*f (a*b)–(c*d) (a*b)–(c*d)+(e*f) (a*b)–(c*d)+(e*f) 4.14 哪些运算符具有副作用?它们具有什么样的副作用? 答:++,--:无论是前缀还是后缀,它们都会更新它们的操作数, = 及复合赋值:它们都更新作为左值的左操作数。 4.15 下面这个表达式的类型和值是什么? (float)(20/6) 答:类型是 float,其值为 3.0。 4.16 为什么说,一个程序如果使用了有符号数的右移位运算,它就是不可移植的? 答:ANSI C 规定:对无符号数而言,所有的移位运算都是逻辑移位;对于有符号数, 是采用逻辑移位还是算术移位,取决于编译器。我们知道,在移位运算中,对任意的数, 算术左移和逻辑左移其结果是一样的。它们只有在右移时不同,而且只有当操作数是负数 时才不一样。由于 ANSI C 对右移的行为没有定义,所以当操作数为负数执行右移时,其值 是不确定的。因此,该程序是不可移植的。 4.17 移位运算中,移位次数可以为负数吗? 答:ANSI C 说明这类移位的行为是未定义的,因而它的结果是不可预测的。基于这个 原因,移位次数应定义为无符号类型。 4.18 计算下列各表达式的值。如果某个表达式具有副作用(它更新了一个或多个变量 的值),请标注它们。在计算每个表达式时,每个变量所使用的是开始时给出的初始值,而 不是前一个表达式的结果。设变量的初始化如下: int a = 10, b = -25; int c = 0, d = 3, e = 20; a. b++ b. a / 6 c. a %= 6 d. b c || ++a > b j. a & 0x1 == b & 0x1 k. a | b << a & b
1.!~b++ n.a0 o.b++&a20?b&kc++:d- 答:本题留给读者上机验证
l. ! ~ b++ m. a – b, c + -d,e – c n. a 0 o. b++ & a 20 ? b && c++ : d-- 答:本题留给读者上机验证