4.1用何种方法可以快速找出字符’$’的ASCII码?
答,printf("ASCII($) = %d\n",(int)’$’);
4.2写出4个不同的表达式,它们分别将整型变量n减去1。
答,n = n-1
n- = 1
--n
n—
4.3构造一个逻辑表达式来表示以下条件:
score大于等于80但小于90;
n在0到9之间,但不是偶数;
n能被3整除,但不能被30整除;
ch是一个小写字母或大写字母。
答:a.(score >= 80 && score < 90)
b.(n > 0 && n < 9 && n % 2 ! = 0)
c.(n % 3 = 0 && n % 30! = 0)
d.((ch >= ’A’ && ch <= ’Z’ ) ||( ch >= ’a’ && ch <= ’z’))
4.4使用条件运算符将x的绝对值赋给absx。
答:absx = (x > 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\n");
答:由于两个无符号数相加,结果仍是一个无符号数,所以输出结果是 >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 – 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;
b++
a / 6
a %= 6
b << 2
a ^ b
c && a
b? a,c
d < a < e
a > c || ++a > b
a & 0x1 == b & 0x1
a | b << a & b
! ~ b++
a – b,c + -d,e – c
a <<= 3 >0
b++ & a <= 30
a <<= d > 20? b && c++,d--
答:本题留给读者上机验证。