练习三
3.1把下面的代数式改写成c语言表达式:
1 ax3+bx2+d  2   3
4 cos60°+ 8e  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),其中cospow为库函数,注意: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的存储状态为81,当用"%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 /= 2a = a /2a = 10a /25, 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  37 % -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计算下面表达式的值:
13 / 2 + 2.0  23 / 2.0 + 2  3 (float)3 / 2 + 2
4float(3 / 2 + 2.0) 5(4 + 1) / 2 + sqrt(9.0) * 1.2 / 2 + 5.5
5x %= 7 + 7 % 5(其中x的值为12) 6(' z' - ' a') % 3 + 3.2
720000 + 20000 - 10000(int2个字节时和4个字节时的值)
答:
13 / 2 + 2.0=1 + 2.0 = 3.0
23 / 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
5x %= 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
720000 + 20000 - 10000(int2个字节时和4个字节时的值)
int2个字节时
int4个字节时
3.11已知ffloat型变量,分别求sizeoff)、sizeoff + 2.3)、sizeoff + 2)、sizeof 3.14sizeof 3.14f的值。
答:
注意:
f + 2的值为double型(这里VC的输出为4似乎有问题,如下所示,在TC中的输出为8),字面量3.14double型,而字面量3.14ffloat型。
3.12 -1+1U等于0吗?-2+1U等于几?-3+1U呢?
答:
int4个字节时,在VC中。
因为-1+1U值的类型为无符号,所以应用格式字符串"%u"输出。
3.13 unsigned short ui = 3uj = 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的值时, uiuj的相反数,即–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= 3a++ = 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小时内删除。