C语言(第二章)作业详解
[题2.1]标识符在命名时,应注意哪几个方面?
在C语言中标识符是用户自定义的一种字符序列,它由字母或下划线开头,由下划线、数字与字母组成的一组符号。在C语言中大小写有区别,一般情况下标识符尽可能“见文识意”,它不能与系统的保留字相同。在C语言的不同编译环境中对于字符串的长度要求也不同,DOS环境下,长度最长32个字符。
[题2.2]C语言中整数-8在内存中的存储形式是什么?
在计算机中所有参与运算的数据在运算的过程中采用补码方式,因此将-8转换为补码保存在计算机中。
-8原码:1000 0000 0000 1000。
-8反码:1111 1111 1111 0111。
-8补码:1111 1111 1111 1000
[题2.3]字符与字符串常量有什么区别?
在C语言中字符是基本数据类型,而字符串不是,在计算机表达字符串时,内部采用字符数组方式。字符使用单引号表示,字符串则使用双引号表示。在字符长度相同的情况下,字符串存储的实际长度比字符多一个字节。可以将字符存储为字符中,但不能将字符串存储为字符。
[题2.4]已知“int i,a;”,执行语句“i=(a=2*3,a*5),a+6”后,变量i的值是多少?
参考代码如下:
# include
main()
{
int i,a;
i=(a=2*3,a*5),a+6;
printf("i=%d a=%d\n",i,a);
}
运行结果如下:
题目解读:
i=(a=2*3,a*5),a+6;应当理解为是“,”运算概念,a+6是内在中的计算内容,它的值与i没有关系。(a=2*3,a*5)中的括号级别最高,优先进行运算,其中的内容中a=2*3与a*5按从左向右运算,因此结果是a=6,然后再计算a*5=30。在此运算结束后将后面的数据作为最终的结果。因此表达式变成了i=30,a+6?i=30,6=6?i=30,12。它最终的结果如截屏所示。
试分析下面代码的结果。
# include
main()
{
int i,a;
i=(a=2*3,a*5),a+6;
printf("%d\n",(a=2*3,a*5),a+6);
printf("i=%d a=%d\n",i,a);
}
# include
main()
{
int i,a;
i=(a=2*3,a*5),a+6;
printf("%d\n",((a=2*3,a*5),a+6));/*多了一个括号有什么影响?
printf("i=%d a=%d\n",i,a);
}
[题2.5]设“int i=1,j=2,k=3”,请写出以下表达式的值及计算后变量i,j,k的值。
(1)(++i)*(++j)*(++k)
(2)(i++)*(++j)*(k++)
(3)i=i+j,j=j+k,k=k+i
解答如下:
(1)参考代码:
# include
main()
{
int i=1,j=2,k=3,m;
m=(++i)*(++j)*(++k);
printf("m=%d i=%d j=%d k=%d\n",m,i,j,k);
}
说明:
++i表示的概念是先自增然后再使用其值参与运算。它等价与i=i+1之后再参与相关运算。同理j与k道理相同,因此表达式为2*3*4=24。
(2)参考代码
# include
main()
{
int i=1,j=2,k=3,m;
m=(i++)*(++j)*(k++);
printf("m=%d i=%d j=%d k=%d\n",m,i,j,k);
}
说明:
i++表示先参与运算,然后i再实现自增。表达式为1*3*3=9。
(3)参考代码
# include
main()
{
int i=1,j=2,k=3,m;
i=i+j,j=j+k,k=k+i;
printf("i=%d j=%d k=%d\n",i,j,k);
}
[题2.6]求下面算术表达式的值。
(1)x+a%3*(int)(x+y)%2/4(设x=2.5,a=7,y=4.7)
(2)(float)(a+b)/2+(int)x%(int)y(设a=2,b=3,x=3.5,y=2.5)
解答如下:
(1)参考代码:
# include
main()
{
float x=2.5,y=4.7;
int a=7;
float c;
c=x+a%3*(int)(x+y)%2/4;
printf("x+a%%3*(int)(x+y)%%2/4=%f\n",c)