第2章 C语言的基本数据类型与表达式习题解答
1.指出下列常数中哪些是符合C语法规定的?
\ 101 \\  e3  019  0xle  ab\n 1.e5  (2+3)e(4-2)  5.2e2.5
符合C语法规定的常数有: \\  019  0xle ab\n 1.e5 
\  转义字符不能作字符常量
101字符串要双引号,字符要转义字符:\101
  e3  浮点常数在e之前应有尾数
(2+3)e(4-2) 浮点常数的尾数和指数部分均不能是表达式
5.2e2.5 浮点常数的指数部分不能是小数。
2.请出下列程序中的错误,改正后写出程序运行结果。
#include<stdio.h>
void main()
{
    int x,y=z=5,aver; //定义变量时不能连续赋值,aver为正数不能存储带小数的平均数
    x=7              //以“;”语句结束
    AVER=(x+y+z)/3  //行末差“;”,AVER为小写, 除数应有小数部分,商才有小数部分
    printf("AVER=%d\n",aver)  //行末差“;”
}
正确的程序如下:
#include<stdio.h>
void main()
{
    int x,y=5,z=5;
    float aver;
    x=7;
    aver=(x+y+z)/3.0;
    printf("AVER=%f\n",aver);
}
运行结果:AVER=5.666667
#include<stdio.h>
void main()
{
    char c1='a';c2='b';c3='c';//连续定义变量有“,”分隔
    int a=3.5;b='A';
    printf("a=%d b=\'%c\'\"end\"n",a,b);  //输出语句无语法错,但格式不清晰
    printf("a%c b%c\bc%c\tabc\n",c1,c2,c3);
}
正确的程序如下:
#include<stdio.h>
void main()
{
    char c1='a',c2='b',c3='c';
    int a=3.5,b='A';
    printf("a=%d b=\'%c\' \"end\"\n",a,b);
    printf("a%c b%c \bc%c \tabc\n",c1,c2,c3);
}
运行结果:
a=3 b='A' "end"
aa bbcc        abc
3.写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格真上赋值后的数据(实数保留到小数后两位)。
c语言中逗号运算符怎么运算
int
99
104
66
55
68
-1
char
c
h
B
7
D
-1
Unsigned int
99
104
66
55
68
ffffffff
Float
99.00
104.00
66.00
55.78
68.00
-1.00
Long int
99
104
66
55
68
-1
4.写出程序运行结果
#include<stdio.h>
void main()
{
    int i,j;
    i=8,j=10;   
    printf("%d %d %d %d\n",i,j,++i,j++);   
}
运行结果:
9 10 9 10
#include<stdio.h>
void main()
{
    int a=1,b=2,c=3;   
    printf("%d %d %d %d\n",a=b=c,a=b==c,a==(b=c),a==(b==c));   
}
运行结果:
3 1 0 0
#include<stdio.h>
void main()
{
    int a=10,b=20,c=30,d;
    d=++a<=10||b-->=20||c++;
    printf("%d %d %d %d\n",a,b,c,d);   
}
运行结果:
11 19 30 1
注:在表达式:“d=++a<=10||b-->=20||c++;”中有三个或项,从左到右依次进行运算,第一个或项结果为0,第二个或项结果为1,因此最终的或结果肯定为1,程序没有进行第三个或项的计算,所以c++没有执行,该行运行结束时,c仍为30。
5.写出下面表达式的值(设a=10,b=4,c=5,d=1,x=2.5,y=3.5).
a%=(b%=3)
#include<stdio.h>
void main()
{
    int a=10,b=4;
    printf("%d \n",a%=(b%=3));
}
结果为:0
注:连续赋值操作从右向左进行:
c=b%=3;  //c=1
a%=c;    //10/1的余数为0,向a赋0
a+=a-=a*=a
#include<stdio.h>
void main()
{
    int a=10;
    printf("%d \n",a+=a-=a*=a);   
}
结果为:0
注:连续赋值操作从右向左进行:
a*=a; //a=100
a-=a; //a=0
a+=a; //向赋值为0
(float)(a+c)/2+(int)x%(int)y
#include<stdio.h>
void main()
{
    int a=10,c=5;
    double x=2.5,y=3.5;   
    printf("%发f \n",(float)(a+c)/2+(int)x%(int)y);
}
结果为:9.50
注:(int)x为2,(int)y为3,2%3求得余数为2,(float)(a+c)/2商为7.5,与2相加得9.5
a*=b+c
#include<stdio.h>
void main()
{
    int a=10,b=4,c=5;   
    printf("%d \n",a*=b+c);
}
结果为:90
注:赋值运算符的优先级最低,给定的表达式等价于:a=a*(b+c)
++a-c+b++
#include<stdio.h>
void main()
{
    int a=10,b=4,c=5;   
    printf("%d \n",++a-c+b++);
}
结果为:10
注:计从左到右进行:(++a)-c结果为6,6+b为10,最后完成b++,程序运行后,a=11,b=5,c=4
++a-c+++b
#include<stdio.h>
void main()
{
    int a=10,b=4,c=5;   
    printf("%d \n",++a-c+++b);
}
结果为:10
注:给定的表达式应用理解为(++a)-(c++)+b,先执行(++a)-(c++)结果为5,后执行6+b为10,程序运行后,a=11,b=4,c=6.
a<b? x:'A'
#include<stdio.h>
void main()
{
    int a=10,b=4;
    double x=2.5;
    printf("%f \n",a<b? x:'A');
}
结果为:65,即'A'
a+b,18+(b=4)*3,(a/b,a%b)
#include<stdio.h>
void main()
{
    int a=10,b=4,c;
    c=(a+b,18+(b=4)*3,(a/b,a%b));
    printf("%d \n",c);
}
结果为:2
注:逗号表达式返回最后一项的值,即a%b计算得余数为2.
x+a%3*(int)(x+y)%2/4+sizeof(int)
#include<stdio.h>
void main()
{
    int a=10;
    double x=2.5,y=3.5;
    printf("%f \n",x+a%3*(int)(x+y)%2/4+sizeof(int));
}
结果为:6.5
注:其中a%3*(int)(x+y)%2/4=1*0/4=0,sizeof(int)=4.
a<b?a:c<d?c:d
#include<stdio.h>
void main()
{
    int a=10,b=4,c=5,d=1;
    printf("%d \n",(a<b?a:c<d?c:d));
}
结果为:1
注:表达式等价于a<b?a:(c<d?c:d)
b++==c
#include<stdio.h>
void main()
{
    int b=4,c=5;
    printf("%d \n",b++==c);
}
结果为:0
a*=b=c=2
#include<stdio.h>