练习三
3.1把下面的代数式改写成c语言表达式:
(1) ax3+bx2+d (2) (3)
(4) cos60°+ 8ey (5) (ax+sinπ)
答案:
(1) a * x * x * x + b * x * x + d
(2)(a * b – c * d) / (2 * a)
(3)a /(b + c / a)
(4)cos(3.1415926/180 * 60) + 8 * pow(e, y),其中cos和pow为库函数,注意:cos函数的参数为弧度。
(5)1/2.0*(a * x + sin(3.1415926)),其中sin为库函数,注意不能写成1/2*(a * x + sin(3.1415926)),可参考3.3。
3.2把下面的C语言表达式还原成代数式:
(1) a/b/c*e*3 (2) exp(x*x/2)/sqrt(2*sin(30*3.1415926/180))
(3) sqrt(fabs(pow(x,y)+log(y))) (4) a*e/c/b*3
答案:
printf输出格式 unsigned short(1)或
(2)
(3)
(4)或
3.3求表达式1/2*(a*x+(b+x)/(4*a))的值。
答:
1/2的值为0,故整个表达式的值为0。
3.4参考表3-1,根据操作符的优先级和结合性用加括号方式确定表达式的求值顺序,如a += a+2的求值顺序可用加括号的方式表示为(a += (a+2))。
(1) flag & n != 0 (2) c = getchar( ) != '\n'
(3) hi << 4 + low (4) *p[3] (5) *p++
(6) 0 < n < q (7) !x || y++ (8) x + y > 0 && i++ < 0
答:
(1) (flag & (n != 0))
(2) (c = (getchar( ) != '\n'))
(3) (hi << (4 + low))
(4) (*(p[3]))
(5) (*(p++))
(6) ((0 < n) < q)
(7) ((!x) || (y++))
(8) (((x + y) > 0) && ((i++) < 0))
3.5试总结C语言操作符优先级的规律。
答:
1.单目操作符的优先级最高
2.算术运算操作符的优先级较高
3.赋值操作符的优先级较底
4.逗号操作符的优先级最底
3.6写出下面程序的输出结果:
#include <stdio.h>
void main( )
{
char x = 0xFFFF;
printf("%d\n", x--);
}
答:
1.给字符型变量赋值时,如果字面量较大,则仅取一个字节,因此变量x的存储状态为8个1,当用"%d"解码时输出为-1.
3.7 int a = 10时,求a -= a *= a += a /= 2的值,a的值为25时呢?
答:
a -= a *= a += a /= 2的求值顺序为(a -= (a *= (a += (a /= 2))))。
a /= 2为a = a /2,a = 10时a /2为5, a /= 2执行后a的值变为5,且子表达式的值为5。原表达式变为(a -= (a *= (a +=5)))。再化简为(a -= (a *=10))、(a -=100),最终变量a的值为0,整个表达式的值也为0。
a的值为25时,(a -= (a *= (a += (a /= 2))))变为(a -= (a *= (a += 12)))、(a -= (a *= 24))、(a -=576)), 最终变量a的值为0,整个表达式的值也为0。
3.8求下面表达式的值并编程验证结果。
(1) -7 / 5 (2)-7 % 5 (3)7 % -5
(4) 7 / -5 (5)-7 / -5 (6)-7 % -5
答:
3.9 对于整型变量i,求表达式(2 * i + 1)/ 2和表达式(2 * i - 1)/ 2的值。
答:
当变量i大于0时,表达式(2 * i + 1)/ 2的值为i,表达式(2 * i - 1)/ 2的值为i-1。
当变量i小于0时,表达式(2 * i + 1)/ 2的值为i+1,表达式(2 * i - 1)/ 2的值为i。
3.10计算下面表达式的值:
(1)3 / 2 + 2.0 (2)3 / 2.0 + 2 (3) (float)3 / 2 + 2
(4)float(3 / 2 + 2.0) (5)(4 + 1) / 2 + sqrt(9.0) * 1.2 / 2 + 5.5
(5)x %= 7 + 7 % 5(其中x的值为12) (6)(' z' - ' a') % 3 + 3.2
(7)20000 + 20000 - 10000(int为2个字节时和4个字节时的值)
答:
(1)3 / 2 + 2.0=1 + 2.0 = 3.0
(2)3 / 2.0 + 2=1.5 + 2 = 3.5
(3) (float)3 / 2 + 2 = 1.5 + 2 = 3.5
(4)(float)(3 / 2 + 2.0) = (float) (1 + 2.0) = 3.0
(5)(4 + 1) / 2 + sqrt(9.0) * 1.2 / 2 + 5.5 = 2 + 1.8 + 5.5 = 9.3
(5)x %= 7 + 7 % 5(其中x的值为12)可改写为:x = x %(7 + 7 % 5)简化为x = 12 % 9,求值后变量x的值为3,表达式的值也为3。
(6)(' z' - ' a') % 3 + 3.2 = 25 % 3 + 3.2 = 4.2
(7)20000 + 20000 - 10000(int为2个字节时和4个字节时的值)
int为2个字节时
int为4个字节时
3.11已知f为float型变量,分别求sizeof(f)、sizeof(f + 2.3)、sizeof(f + 2)、sizeof 3.14和sizeof 3.14f的值。
答:
注意:
f + 2的值为double型(这里VC的输出为4似乎有问题,如下所示,在TC中的输出为8),字面量3.14为double型,而字面量3.14f为float型。
3.12 -1+1U等于0吗?-2+1U等于几?-3+1U呢?
答:
当int为4个字节时,在VC中。
因为-1+1U值的类型为无符号,所以应用格式字符串"%u"输出。
3.13 有unsigned short ui = 3,uj = 5时,表达式ui - uj等于几?
有同学认为等于-2,因为编程验证时语句printf("%hd\n", ui - uj)的输出为-2。
有同学认为表达式ui - uj的值是无符号型,它不可能等于-2。
你的观点呢?当有short k = -5时,表达式ui + k的值是多少呢?
答:
语句printf("%hd\n", ui - uj)的输出结果不能证明ui – uj的值为-2,因为printf函数只按参数的格式字符串解码数据。
表达式ui – uj中一个为无符号数,结果应该也为无符号数,但是由例3-4的讨论可知,由于算术运算时,“短整型”都要统一为int型,这个操作可能改变变量的类型,故原表达式的类型需要讨论,只有确定了类型之后,才能讨论它的值。
在VC中,求值时unsigned short要统一为4个字节的int型,统一后变量的类型也变成了有符号数,因此,表达式ui – uj的值为有符号整数,为-2。
在TC中,int型为2个字节, unsigned short类型可直接求值,表达式ui – uj的值为无符号数,为65534。
在求ui – uj的值时, ui加uj的相反数,即–5的补码。当有short k = -5时,表达式ui + k的求值过程与表达式ui – uj的类似。
3.14 写出并分析下面程序的输出结果:
#include <stdio.h>
void main()
{
int i, j, k;
i = j = k = 3;
k = i++ + 1;
printf("%d,%d,", i, k);
k = ++i + 1;
printf("%d,%d\n", i, k);
k = j-- - 1;
printf("%d,%d,", j, k);
k = --j - 1;
printf("%d,%d\n", j, k);
}
答:
k = i++ + 1;// k =3+1且变量i自增1变为4
k = ++i + 1; //变量i自增1变为5,k =5+1
k = j-- - 1; // k =3-1且变量j自减1变为2
k = --j - 1; //变量j自减1变为1,k =1-1
3.15分析表达式(a = n)= 3和a++ = 3的合法性。
答:
表达式(a = n)= 3中,先求子表达式a = n的值,为变量a,则原表达式变为a = 3,故表达式(a = n)= 3合法。
表达式a++ = 3中,赋值操作符的左边不是变量,原表达式不合法。
注:如果认为子表达式a = n的值为具体的数值时,则表达式(a = n)= 3也不合法。
3.16 改写表达式(i++) + (i++) + (i++),使其结果与编译系统无关。
答:
1)int i=2,j;
j = i; 原表达式改写为j + j +j; i += 3;
2)int i=2, j;
j = i++; j += i++; j+=i++;
3.17 已知float f = 5.1739,求表达式(int)(f * 100 + 0.5)/ 100、(int)(f * 100 + 0.5) / 100.0、(f * 100 + 0.5)/ 100和(f * 100 + 0.5)/ 100.0的值。
答:
(int)(f * 100 + 0.5)/ 100 = (int)517.89 / 100 = 517 / 100 = 5
(int)(f * 100 + 0.5) / 100.0 = 517 / 100.0 = 5.17
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论