目录
一、数据类型介绍
1.1 数据类型
- 字符型
char //character [signed] char //有符号的 unsigned char //⽆符号的
- 整型
//短整型 short [int] [signed] short [int] unsigned short [int] //整型 int [signed] int unsigned int //⻓整型 long [int] [signed] long [int] unsigned long [int] //更⻓的整型 //C99中引⼊ long long [int] [signed] long long [int] unsigned long long [int]
- 浮点型
float double long double
- 布尔类型
//c99中引入布尔类型,专门表示真假 _Bool //布尔类型的使⽤得包含头⽂件 <stdbool.h> //布尔类型变量的取值是: true 或者 false #define bool _Bool #define false 0 #define true 1 //代码演示 _Bool flag = true; if (flag) printf("i like C\n");
1.2 各种数据类型长度
1.2.1 sizeof操作符
sizeof是一个关键字,也是操作符,专门用来计算sizeof的操作符数的类型长度,单位是字节。sizeof 的计算结果是 size_t 类型的。
sozeof操作符的操作数可以是类型,也可以是变量或者表达式。
sizeof( 类型 )
sizeof 表达式
注:sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
//测试:sizeof中表达式不计算
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b + 1));
printf("s = %d\n", s);
return 0;
}
1.2.2 数据类型长度
#include <stdio.h>
int main()
{
printf("%zd\n", sizeof(char)); //1
printf("%zd\n", sizeof(_Bool)); //1
printf("%zd\n", sizeof(short)); //2
printf("%zd\n", sizeof(int)); //4
printf("%zd\n", sizeof(long)); //4
printf("%zd\n", sizeof(long long)); //8
printf("%zd\n", sizeof(float)); //4
printf("%zd\n", sizeof(double)); //8
printf("%zd\n", sizeof(long double)); //8
return 0;
}
二、signed 和 unsigned
C语言使用signed 和 unsigned 关键字修饰 字符型和整型 类型。
int类型默认带正负号
signed int a;
// 等同于int a;
int类型也可不带正负号,必须使用unsigned
unsigned int a;
unsigned a;//int 也可省略
#define SHRT_MIN (-32768) //有符号16位整型的最⼩值
#define SHRT_MAX 32767 //有符号16位整型的最⼤值
#define USHRT_MAX 0xffff //⽆符号16位整型的最⼤值
#define INT_MIN (-2147483647 - 1) //有符号整型的最⼩值
#define INT_MAX 2147483647 //有符号整型的最⼤值
注意:C语言规定,char类型默认是否带有正负号,由当前系统决定。可能有,也可能没有。
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255
三、数据类型的取值范围
四、变量
1. 变量创建
2. 变量分类
1)全局变量:大括号外部定义,存放在内存静态区
2)局部变量:大括号内部定义 ,存放在内存栈区
3)同名时,局部变量优先使用;堆区用来管理动态内存
五、算数操作符
+ - * / % (双目操作符:两个操作数)(运算符)
注:负数求模规则是:结果的正负号由第一个运算数的正负号决定
六、赋值操作符
int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符
1. 连续赋值
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的
//这种连续赋值写出的代码不容易理解
//建议:
int a = 3;
int b = 5;
int c = 0;
b = a+3;
c = b;
2. 复合赋值符
+= -=
*= /= %=
>>= <<=
&= |= ^=
七、单目操作符
++ -- + - (这里的+代表正号,-代表负号)
1. ++和--
前置:先算后用
后置:先用后算
2. + 和 -
int a = +10; 等价于 int a = 10;
int a = -10;
int b = -a;
printf("b=%d\n", b); //这⾥的b是10
八、强制类型转换
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分
九、scanf 和 printf 介绍
1. printf
1.1 头文件
stdio.h
1.2 占位符
参数和占位符一一对应,如果参数个数少于占位符个数,可能输出内存中任意值
%c | 字符 |
%d | 十进制整数 //int |
%f | 小数 // float - %f double - %lf |
%hd | 十进制 short int 类型 |
%hu | unsigned short int 类型 |
%ld |
⼗进制 long int 类型
|
%lu |
unsigned long int 类型
|
%Lf |
long double 类型浮点数
|
%p |
指针(⽤来打印地址)
|
%s |
字符串
|
%u |
⽆符号整数(unsigned int)
|
%x |
⼗六进制整数
|
%zd |
size_t
类型
|
1.3 输出格式
1. 限定宽度
printf("%5d\n", 123); // 输出为 " 123"
printf("%-5d\n", 123); // 输出为 "123 "
printf("%12f\n", 123.45); // 输出 " 123.450000"
//⼩数的默认显⽰精度是⼩数点后6位,输出结果的头部会添加2个空格
printf("%+d\n", 12); // 输出 +12
printf("%+d\n", -12); // 输出 -12
//确保输出数字带有正负号
printf("Number is %.2f\n", 0.5); // 输出 Number is 0.50
printf("%6.2f\n", 0.5); // 输出为 " 0.50"
//%6.2f表⽰输出字符串最⼩宽度为6,⼩数位数为2
//也可以写成:
printf("%*.*f\n", 6, 2, 0.5);
printf("%.5s\n", "hello world"); // 输出 hello
//%.5s表⽰只输出字符串“hello world”的前5个字符
2. scanf
2.1 基本用法
头文件:stdio.h
注意:变量前面必须加上&运算符(指针变量除外),因为scanf()传递的不是值,而是地址,即将变量i的地址指向用户输入的值
2.2 返回值
scanf()的返回值是一个整数,表示成功读取的变量个数
如果没有读取任何项,或者匹配失败,则返回0。
如果在成功读取任何数据之前去,发生读取错误或者遇到读取到文件结尾,则返回常量 EOF(-1)。
2.3 占位符
%c | 字符 |
%d | 整数 |
%f | float类型浮点数 |
%lf | double类型浮点数 |
%Lf | long double类型浮点数 |
%s | 字符串(其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌) |
%[ ] | 在方括号中指定一组匹配的字符(比如%[0-9]),遇到不在集合之中的字符,匹配停止 |
注意:上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。
char name[11];
scanf("%10s", name);
//表⽰最多读取⽤⼾输⼊的10个字符,后⾯的字符将被丢弃,这样就不会有数组溢出的⻛险