数据类型
1.字符型
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来。
内存中只能存储二进制数,如何存储字符,需要将字符转换为二进制存储在内存中,对应编码使用ASCII表
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
1.1 ASCII表
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。
#include <stdio.h>
int main()
{
char ch = 'a';
printf("sizeof(ch) = %u\n", sizeof(ch));
printf("ch[%%c] = %c\n", ch); //打印字符
printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值
char A = 'A';
char a = 'a';
printf("a = %d\n", a); //97
printf("A = %d\n", A); //65
printf("A = %c\n", 'a' - 32); //小写a转大写A
printf("a = %c\n", 'A' + 32); //大写A转小写a
ch = ' ';
printf("空字符:%d\n", ch); //空字符ASCII的值为32
printf("A = %c\n", 'a' - ' '); //小写a转大写A
printf("a = %c\n", 'A' + ' '); //大写A转小写a
return 0;
}
字符0在内存中存储的是48,数字0在内存中存储的是0
- 字符所对应的最大ASCII码值为127,就可以表示所有的字符,所以就可以使用char类型进行存储单个字符,所以char类型又称为字符型
1.2 字符变量的输入
#include <stdio.h>
int main()
{
char ch;
printf("请输入ch的值:");
//不要加“\n”
scanf("%c", &ch);
printf("ch = %c\n", ch); //打印ch的字符
return 0;
}
1.3 转义字符
有特使含义的字符,反斜杠+字母表示一个字符
#include <stdio.h>
int main()
{
printf("abc");
printf("\refg\n"); //\r切换到句首, \n为换行键
printf("abc");
printf("\befg\n");//\b为退格键, \n为换行键
printf("%d\n", '\123');// '\123'为8进制转义字符,0123对应10进制数为83
printf("%d\n", '\x23');// '\x23'为16进制转义字符,0x23对应10进制数为35
return 0;
}
1.4 字符与数值转换
#include <stdio.h>
int main(){
char ch_1 = 'a'; // 在内存中存储的是97 ascii码
//打印字符的ascii码 使用%d
printf("%d\n",'a'); // 97
printf("%d\n",'\n'); // 10
// 打印ascii数值对应的字符 %c
printf("%c\n",ch_1); // 'a'
char ch = '8'; // 定义字符8
// 将字符8转化为数字8
// 用字符8-字符0就可以
// 大写和小写转换 a - 97 A - 65 ascii相差32
char ch_2 = 'A';
ch_2 = ch_2 + 32 ;
ch_3 = ch_2 + ' ';
printf("%c\n",ch_2); // a
// sizeof()
printf("%d\n",sizeof(ch_2)); // 1个字节--数据类型长度
printf("%d\n",sizeof('a'); // 4字节-- 'a'-->97-->int类型-->4个字节
return 0;
}
1.5 读取多个字符
#include <stdio.h>
int main(){
char ch = 0;
scanf("%c",&ch); // 此时键盘输入a,ch被赋值a;键盘输入abc回车,ch也被赋值a,只能读一个
printf("%c\n",ch);
// 读取两个字符--键盘输入两个字符
char ch_1 = 0;
char num = 0;
scanf("%c".&ch_1); // 此时阻塞,等待输入,输入a回车, ch_1得到a num得到\n
scanf("%c",&num);
printf("%c\n",ch_1);
printf("%c\n",num);
print("%d\n",ch_1); // 97
printf("%d\n",num); // 10
// 要连续输入两个字符给两个变量,必须将中间输入的回车\n吃掉,多加一个scanf()
char ch_1 = 0;
char num = 0;
scanf("%c".&ch_1); // 此时阻塞,等待输入,输入a回车,b回车, ch_1得到a num得到b
printf("%c\n",ch_1);
scanf("%c",&ch_1)
scanf("%c",&num);
printf("%c\n",num);
print("%d\n",ch_1); // 97
printf("%d\n",num); // 10
system("pause");
return 0;
}
2.浮点型
实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
float占4个字节,double占8个字节
#include <stdio.h>
int main()
{
// 浮点型数据打印的时候,默认输出6位小数
float a = 3.1415926456;
double b = 3.1415926456;
printf("%f\n",a);
printf("%f\n",b); // a b 都输出6位小数
// 输出多位小数 %m.nf -- m表示数据宽度, .n 表示输出几位小数
printf("%.8f\n",a)
// float有效精度7位,double有效精度是15位
printf("%.8f\n",b); // a = 3.14159274 b = 3.14159264;
//传统方式赋值
float a = 3.14f; //或3.14F
double b = 3.14;
printf("a = %f\n", a);
printf("b = %lf\n", b);
//科学法赋值
a = 3.2e3f; //3.2*1000 = 3200,e可以写E
printf("a1 = %f\n", a);
a = 100e-3f; //100*0.001 = 0.1
printf("a2 = %f\n", a);
a = 3.1415926f;
printf("a3 = %f\n", a); //结果为3.141593
system("pause")
return 0;
}
3.限定符
volatile int sum;
for(int i = 0;i < 100;i++){
sum = i
}
// 结果等价于是: sum = 99,编译器会将上述代码进行优化,但是有时候在描述硬件的时候不想
// 编译器进行优化,所有加上volatile关键字进行修饰
register将变量定义在寄存器,一些变量经常使用,定义在寄存器中,方便进行计算
4.字符串常量
- 字符串常量使用双引号引起来
- 字符串是内存中一段连续的char空间,以'\0'(数字0)结尾。
- 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
- "abc" -- 在内存中实际上是四个字符 abc\0,\0得存在实际上是为了方便对字符串进行操作,比如进行字符串打印
字符串常量与字符常量的不同:
每个字符串的结尾,编译器会自动的添加一个结束标志位'\0',即 "a" 包含两个字符'a'和’\0’。
#include <stdio.h>
int main()
{
string str = "abc";
printf("%s\n",str);
system("pause");
return 0;
}
- 字符0('0') -- 在内存存储ascii码 -- 48
- \0 -- 在内存中存储0
- 数字0 -- 在内存中存储0
- 数字0和\0等价
5.输入输出函数
5.1 printf()和putchar()
printf是输出一个字符串,putchar输出一个char。
#include <stdio.h>
int main()
{
char ch = 'a';
printf("%c\n",ch); // 使用%c打印一个字符
putchar(ch); // 使用putchar函数打印字符
system("pause");
return 0;
}
printf附加格式:
#include <stdio.h>
int main()
{
int a = 100;
printf("a = %d\n", a);//格式化输出一个字符串
printf("%p\n", &a);//输出变量a在内存中的地址编号
printf("%%d\n");
char c = 'a';
putchar(c);//putchar只有一个参数,就是要输出的char
long a2 = 100;
printf("%ld, %lx, %lo\n", a2, a2, a2);
long long a3 = 1000;
printf("%lld, %llx, %llo\n", a3, a3, a3);
int abc = 10;
printf("abc = '%6d'\n", abc); // 打印宽度6
printf("abc = '%-6d'\n", abc); // 左对齐6位宽度
printf("abc = '%06d'\n", abc); // 不足6位前面补0
printf("abc = '%-06d'\n", abc); // err,左对齐,左补0冲突
double d = 12.3;
// m.n m--表示宽度 .m表示小数位数
printf("d = \' %-10.3lf \'\n", d); // '12.300 '
return 0;
}
5.2 scanf()和getchar()
- getchar是从标准输入设备读取一个char。
- scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
#include <stdio.h>
int main()
{
char ch1;
char ch2;
char ch3;
int a;
int b;
printf("请输入ch1的字符:");
ch1 = getchar();
printf("ch1 = %c\n", ch1); // 输入a 回车
getchar(); //测试此处getchar()的作用,将上面的回车吃掉
printf("请输入ch2的字符:");
ch2 = getchar(); // 输入b回车
printf("\'ch2 = %ctest\'\n", ch2);
getchar(); //测试此处getchar()的作用 // 吃掉回车
printf("请输入ch3的字符:"); // 输入c
scanf("%c", &ch3);//这里第二个参数一定是变量的地址,而不是变量名
printf("ch3 = %c\n", ch3);
printf("请输入a的值:");
scanf("%d", &a);
printf("a = %d\n", a);
printf("请输入b的值:");
scanf("%d", &b);
printf("b = %d\n", b);
return 0;
}