目录
1.数据类型
C语言中的数据类型描述生活中的数据,用整型描述整数,用字符型描述字符,浮点型描述小数。写代码是为了解决生活中的问题,写出的代码可以描述出现实。将生活的问题转化为数据,不同的数据特征编写不同数据类型的代码。数据类型分为内置类型金和自定义类型两种,如下:
本章节主要讨论内置类型。
1.1数据类型
- 字符型:char、signed char(有符号的)、unsigned char(无符号的),大部分编译器char就是signed char, char 不等同于signed char, 可能是signed char 也可能是 unsigned char,与int 不同
- 短整型:short int、 signed short int、 unsigned short int
- 整型: int、 signed int、(正数+负数) unsigned int (0+正数), signed int 等同于 int
- 长整型:long int、signed long int、unsigned long int、
- 更长的整型:long long int、signed long long int、 unsigned long long int、
- 浮点型:float、 double、long double
- 布尔类型:-Bool ,C语言原来没有单独设置一个类型,使用整数0表示假,非零值表示真在C99中引入了布尔类型,专门表示真假。布尔类型的使用需要包含头文件<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.1sizeof 操作符
sizeof 是一个关键字,也是操作符,专门用来计算sizeof 的操作符的类型长度的,单位是字节。sizeof 操作符的操作数可以是类型,也可以是变量或者表达式。sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。 sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。 sizeof 的计算结果是 size_t 类型的。
sizef(类型)
sizef 表达式
1.2.2数据类型长度
#include <stdio.h>
int main()
{
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
return 0;
}
运行结果:
1.2.3sizeof中表达式不计算
2.变量
2.1创建变量
int age; //整型变量
char ch; //字符变量
double weight; // 浮点型变量
创建变量时,给一个初始值,就叫初始化
int age = 18; //初始化
char ch ='w';
double weight = 48.0;
unsigned int height = 100;
2.2变量的分类
- 全局变量:在⼤括号外部定义的变量就是全局变量,全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。
- 局部变量:在⼤括号内部定义的变量就是局部变量,局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。
#include <stdio.h> int global = 2023;//全局变量 int main() { int local = 2018;//局部变量 printf("%d\n", local); printf("%d\n", global); return 0; }
当局部变量和全局变量同名的时候,局部变量优先使⽤。
2.3变量的存储位置
- 局部变量放在内存的栈区
- 全局变量放在内存的静态区
- 堆区是用来动态内存管理
3.算术操作符:+、-、*、/、%
为运算方便,C语言中有一系列的算术操作符
3.1.+和-
用来完成加减法,位于操作符两端的就是他们的操作数
3.2.*
来完成乘法
3.3./
来完成除法,除号两端是整数,执行整除除法,只返回整数部分,丢弃小数部分。如果想要得到带小数点的结果,两个运算数必须有一个是浮点数,这是会进行浮点数除法。7.0/5得到1.2。
3.4%
%表示求模或求余运算,返回两个整数相除的余值。此运算符只能用于整数,不能用于浮点数。负数求模的规则是,结果的正负号由第一个运算数的正负号决定
4.赋值操作符:=和复合赋值
创建变量是给一个初始值叫初始化,变量创建好后,在给一个值,叫赋值。
4.1.连续赋值
int a = 3;
int b = 5;
int c = 6;
b = a+3;
c = b; //连续赋值,从右向左依次赋值
4.2.复合赋值符
写代码时,经常对一个数进行自增或者自减的操作
int a = 10;
a = a+3;
a = a-2;
或者更加方便的写法
int a = 10;
a += 3:
a -= 4;
复合赋值操作符:+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
5.单目操作符:++、--、+、-
前面的操作符都是双目操作符,由两个操作数。还有一些操作数只有一个操作数,称为单目操作符
5.1.++和--
++一种自增的操作数,分为前置++和后置++,--是一种自减操作符,分前置--和后置--
5.1.1.前置++
int a = 9;
int b = ++a;
printf("a=%d b=%d\n",a,b);//a是9,先+1,a为10再赋值给b,则b为9
先加1,后使用
5.1.2.后置++
先使用,后加1
5.1.3.前置--
先减1,后使用
5.1.4.后置--
先使用,后减1
5.2.+和-
+表示正号,-表示负号,都是单目操作符
int a = 10;
int b = -a;
int c = -10;
printf("b=%d c=%d\n",b,c); //b和c都是-10
int a = -10;
int b = -a;
printf("b=%d\n",b) //b是-10
6.scanf和printf
6.1.printf
6.1.1.用法
printf()将文本打印到屏幕上。f代表format(格式化),表示可以定制输出文本格式,printf()不会自动添加换行符,不会自动换行。通常再文本结尾添加一个换行符\n。
#include<stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
内部有换行,也是通过换行符
#include<stdio.h>
int main()
{
printf("Hello World\n");
printf("Hello\n");
printf("World\n");
return 0;
}
使用printf()时,要包含头文件stdio.h。
6.1.2.占位符
占位符的第一个字符一律为%d,第二个字符表示占位符的类型,%d表示代入的值为一个整数。另外%s表示代入的字符串。 输出文本时可以使用多个占位符
6.1.3.举例
- %a: 16进制浮点数,字母输出为小写。
- %A:16进制浮点数,字母输出为大写。
- %c:字符。
- %d:10进制整数。// int
- %f: 小数(float类型和double类型)。// float %f double %lf
6.1.4.显示正负号
通常情况下,pirntf()不对正数显示+号,只对负数显示-号,在占位符%后面加一个+,正数可以输出+号。
#include<stdio.h>
int main()
{
printf("%+d\n",12); //输出+12
printf("%+d\n",-12);//输出-12
return0;
}
6.1.5.限定小数位数
假如,希望小数点后面只保留两位,占位符可写成%.2f。
#include<stdio.h>
int main()
{
printf("Number is %.2f\n",0.5); //输出Number is 0.50.
printf("%.5s","hello world")
return 0;
}
6.1.5.输出部分字符串
%s输出全部的字符串,可以用%.[m]s指定输出长度,m代表要输出的长度。在上例中,%.5s表示只输出hello。
6.2.scanf
需要给变量输入值时,使用scanf函数,若要将变量的值输出到屏幕上,使用printf函数。例子如下:
#include<stdio.h>
int main()
{
int score = 0;
printf("输入成绩:");
scanf("%d",&score);
printf("成绩是%d\n",score);
return 0;
}
//输入成绩:90
// 成绩是:90
6.2.1.基本用法
scanf()函数,用于读取用户的键盘输入,它的原型定义在头文件stdio.h。
scanf("%d",&i)
上述例子中,第一个参数%d,表示输入一个整数。第二个参数&i表示,从键盘输入的整数存入变量i。(scanf()函数传递的不是值,而是地址,变量i的地址指向用户输入的值,因此变量前面必须加上&运算符。) 一次输入多个值:
scanf("%d %d %f %f",&i,&j,&x,&y);
四个数10 20 3.5 4.6,依次放入i j x y四个变量中。scanf()处理占位符时,会自动过滤空白字符,包括空格、制符表、换行符等。
6.2.2.scanf的返回值
scanf()的返回值是一个整数,表示成功读取的变量个数。如果没有读取任何项,或者匹配失败,则返回0。在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。EOF-end of file文件结束标志。
6.2.3.占位符
- %c: 字符。
- %d: 整数。
- %f: float类型浮点数。
- %lf: double类型浮点数。
- %Lf: long double类型浮点数。
- %s: 字符串。
- %[]: 在括号中指定一组匹配的字符,可以写成
占位符%s,从当前第一个非空白字符开始读起,直到遇到空白字符为止。scanf() 函数不适合读取可能包含空格的字符串,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。scanf(" %c",&ch)
scanf() 函数将字符串读入字符组时,不会检测字符串是否超过了数组长度,所以使用%s占位符时,要指定字符串的最长长度,写成%[m]s, [m]表示读取字符串的最长长度,后面的全部丢弃,不会有溢出的风险。
#include<stdio.h>
int main()
{
char name[11];
scanf("%10s",name); //最多读取10个字符
return 0;
}
6.2.4.赋值忽略符
有时,输入可能不符合预定的格式。
#include<stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d",&year,&month,&day);
printf("%d %d %d\n",year,month,day);
return 0;
}
输入2024-6-28,就会正确显示出年、月、日。如果输入其他的格式,如2024/6/28,就会解析数据失败。为避免发生这种情况,scanf()提供了一个赋值忽略符 * 把它加在任何占位符的百分号后面,该占位符就不会返回值,解析后被丢弃。