一、一个示例程序
#include <stdio.h>
int main(void){
float weight,value;//声明两个浮点型的变量
printf("please enter your weight:");
scanf("%f",&weight);//%f用来处理浮点值,scanf()是读取用户输入的浮点数,&weight告诉scanf()将输入的浮点数赋给名为weight的变量
value=weight*233.55;//进行乘法运算
printf("gold price is %.2f",value);//.2代表小数点后保留2位小数,gold price is 28026.00
return 0;
}
二、变量与常量数据
有些数据在程序使用之前已经设定好了,在整个程序的运行过程中没有变化,这些被称为常量,比如上面示例中的233.55。
其他数据类型在程序运行中可能被改变或赋值,这些被称为变量,比如上面示例中的weight。
三、数据:数据类型关键字
最初K&R给出的关键字 | C90标准添加的关键字 | C99标准添加的关键字 |
int | signed | _Bool(布尔值) |
long | void | _Complex(复数) |
short | _Imaginary(虚数) | |
unsigned | ||
char | ||
float | ||
double |
按计算机的存储方式可以分为两大基本类型:整数类型和浮点数类型。
计算机把浮点数分为小数部分和指数部分来表示,而且分开存储这两部分。例如:7.00和7的存储方式是不同的,7.0可以写成0.7E1,0.7是小数部分,1是指数部分。
1、整数和浮点数存储的区别
① 整数没有小数部分,浮点数有小数部分;
② 浮点数可以表示的范围比整数大;
③ 对于一些算术运算,浮点数损失的精度更多;
④ 在区间内都存在无穷个实数,所以计算机的浮点数不能表示区间内的所有值,通常只是实际值的近似值;
⑤ 浮点运算比整数运算慢。
四、C语言的数据类型
1、int类型
int值目前是32位,取值范围是-2^31~2^31-1
① 声明int变量
//声明int变量,但还没有赋值
int num1;
int num2,num3;
② 初始化变量
就是为变量赋一个初始值,可以先声明再赋值,也可以在声明中赋值
//初始化变量
int num4;
num4 = 10; //先声明再赋值
int num5 = 20; //声明并赋值
int num6, num7 = 30; //声明两个变量并为其中一个变量赋值,可以但不建议
③ int常量
如上面出现的10、20、30都是int常量
④ 打印int值
void example3() {
int ten = 10;
int two = 2;
printf("%d - %d = %d\n", ten, two, ten - two);
/**
* 输出结果:10 - 2 = 8
* %d称为转换说明,它指明了在一行中打印整数的位置,每个%d都与变量列表中的值相匹配,所以要确保要打印的值与列表中的值数量相同
*/
}
⑤ 八进制与十六进制
以十进制显示数字使用%d
以八进制显示数字使用%o,前缀0,要显示前缀使用%#o
以十六进制显示数字使用%x,前缀0x,要显示前缀使用%#x
void example4() {
int num = 10;//10在十六进制中是a
printf("十进制:%d 八进制:%o 十六进制:%x\n", num, num, num);//十进制:10 八进制:12 十六进制:a
printf("十进制:%d 八进制:%#o 十六进制:%#x", num, num, num);//十进制:10 八进制:012 十六进制:0xa
}
2、其他整数类型
使用时再百度
3、字符:char类型
char类型用于存储字符,但从技术层面上看,char是整数类型,因为char类型实际上存储的是整数而不是字符。计算机使用数字编码来处理字符,它用特定的整数来表示特定的字符,例如在ASCII编码中,整数65代表大写字母A,因此存储字母A实际上存储的是整数65。
① 声明char类型变量并初始化
用单引号括起来的字符称为字符常量,编译器发现'A',会将其转化为相应的代码值
char c='T';
因为字符是以数值的形式存在的,所以也可以用数字代码赋值,如下:
char c = 65;//可以这样做,但这不是一种好的编程习惯
② 转义序列
③ 打印字符
%d转换说明打印类型变量的值是一个整数,而%c转换说明则是打印该整数对应的字符。
void example5() {
char c;
scanf("%d", &c);//使用%d时输入整数,使用%c时输入字符
printf("use d is:%d\n", c); //use d is:65
printf("use c is:%c\n", c); //use c is:A
}
注意:printf()中的转换说明决定了数据的显示方式,而不是数据的存储方式,存储都是整数。
4、布尔类型_Bool
值1表示true,值0表示false,所以_Bool实际上也是一种整数类型,它仅占一位存储空间
void example6() {
int i = 5;
_Bool b = i > 3;
if (b) {
printf("%d", b); //1
} else {
printf("test");
}
}
5、float和double
① float和double的区别
float | double | |
至少能表示的有效数字 | 6位 | 6位 |
取值范围 | 10^-37~10^+37 | |
所占位数 | 32位,8位表示指数值和符号,24位表示非指数部分 | 64位,多出的32位全部表示非指数部分 |
变量声明 | 带f或F后缀 | 系统默认 |
转换说明 | %f | %f |
② 声明浮点数变量并赋值
void example7() {
float f = 1.2e3;
double d = 2.5e2;
float t = 30.15f;
printf("%f\n", f * 10); //12000.000000至少6个有效数位
printf("%.2f\n", d * 10); //2500.00,.2表示保留两位有效数位
printf("%.1e\n", d * 10); //2.5e+003,使用指数记数法表示,并保留一位有效数位
printf("%e", t); //3.015000e+001
}
6、类型大小
%zd转换说明匹配sizeof的返回类型,不支持c99和c11的可以使用%u或%lu
void example8() {
printf("%u\n", sizeof(int)); //4 bytes
printf("%u\n", sizeof(char)); //1 byte
printf("%u\n", sizeof(float)); //4 bytes
printf("%u\n", sizeof(double)); //8 bytes
printf("%u\n", sizeof(_Bool)); //1 byte
printf("%u\n", sizeof(long double));//12 bytes
}
7、刷新输出
printf()语句把输出发送到一个叫缓冲区的中间存储区域,当缓冲区满、遇到换行字符或需要输入的时候,然后缓冲区中的内容就会被刷新到屏幕上。