数据类型

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得存在实际上是为了方便对字符串进行操作,比如进行字符串打印
    字符串常量与字符常量的不同:
    05-数据类型-LMLPHP
    每个字符串的结尾,编译器会自动的添加一个结束标志位'\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;
}

03-14 22:42