练习4
4.1 C语言中“真”和“假”的编码有何特点?e为整型变量,!e与e != 1等价吗?与e == 0等价吗?
答:
C语言中“真”和“假”的编码简单地说,0表示“假”,非0代表“真”。在逻辑运算时如此,0表示“假”,非0代表“真”。不过需注意,在表示逻辑运算结果时,“假”为0, “真”为1。
当e为0时,!e的值为1;e != 1的值为0; e == 0的值为1。
当e为非0时,!e的值为0;e != 1的值可能(e不等于0也不等于1时)为0,可能(e等于1时)为1,; e == 0的值为0。
反之,e == 0的值为0时,e为非0,!e的值也为0。
e == 0的值为1时,e为0,!e的值也为1。
综上所述:
!e与 e != 1不等价,与e == 0等价。
4.2 C语言中逻辑量的编码特点对算术运算和逻辑运算有何影响?
答:由于没有专门的逻辑类型,C语言中的算术运算和逻辑运算可以“混合”,如!5*3,而类似的表达式往往没有什么实际意义。
4.3 给出逻辑或||和逻辑非!的真值表。
答:
逻辑或||的真值表
a 的值b的值a || b的值真(非0)真(非0)真(1)真(非0)假(0)真(1)假(0)真(非0)真(1)假(0)假(0)假(0)逻辑非!的真值表
a 的值!a的值真(非0)假(0)假(0)真(1)4.4 计算下面各逻辑表达式的值,其中字母均为变量,且a=2,b=3,c=5。
1. a * b > c && a + b <= c 2. a + b > c || a + b < c
3. '0' && a < c – 1 4. '\0' || !(a > c) - 1
5. a > b < c 6. !a * c > b || c = a
7. a > 0 && (x = b || 1) 8. !(x = c) || a == b - 1
答:
1. a * b > c的值为真,a + b <= c的值为真,故原表达式为真。
2. a + b > c的值为假,a + b < c的值为假,故原表达式为假。
3. '0'的值为真,a < c – 1的值为真,故原表达式为真。
4. '\0'的值为假,!(a > c) - 1为假,故原表达式为假。
5. a > b的值为假(0),0 < c的值为真,故原表达式为真。
6. !a * c > b为假,c = a的值为真,故原表达式为真。
7. a > 0的值为真,(x = b || 1) 的值为真,故原表达式为真。
8. !(x = c) 的值为假,a == b - 1的值为真,故原表达式为真。
4.5 写出与下面结论等价的C语言表达式。
1. 三边长为a,b,c的三角形是直角三角形。
2. a,b,c 三个整数中b最大。
3. a,b,c三个整数中,至少有两个是负数。
4. a,b,c三个整数中,只有两个是负数。
5. 字符型变量ch为大字字母。
6. x的取值范围在[1,10]或(23,72]。
7. 1 < x < 3或x < 0。
9. x取值为函数f(x)=的定义域。
答:
1. a*a + b*b == c*c || a*a + c*c == b*b|| b*b + c*c == a*a
2. b > a && b > c
3. a < 0 && b < 0 || a < 0 && c < 0 || b < 0 && c < 0
4. a<0 && b<0 && c>=0 || a<0 && c<0 && b>=0 || b<0 && c<0 && a>=0
5. ch >=’A’ && ch <= ‘Z’
6. x >= 1 && x <= 10 || x > 23 && x <= 72
7. x > 1 && x < 3 || x < 0
8. (x >= 2 || x <= 1) && x != 0
4.6 用两条语句x < 0 && (x = -x); printf("%f\n", x);可以输出x的绝对值吗?如何评价这样的语句?
答:可以,不过可读性太差!
4.7 用if结构验证练习三的3.12, 3.13题,并为3.20,3.23和3.27的程序中增加输入数据合法性检查的代码。
答:
3.12
3.13(原答案已经用if结构验证了)
3.20
3.23
if(!(c >= 'b' && c <= 'y'))
{
printf("输入错误,程序退出!\n");
return;
}
3.27
if(!(fa + fb > fc && fa + fc > fb && fc + fb > fa))
{