1.数据类型介绍
C语言提供的各种数据类型如下图所示,本次将主要探讨内置数据类型。
char//字符型
[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]
//更⻓的整型
long long [int]
[signed] long long [int]
unsigned long long [int]
//浮点型
float
double
long double
//布尔型
_Bool
//表示真假,布尔类型变量的取值是:true 或者false.
2.各种数据类型的⻓度
每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不同,存储的数据范围就有所差异。
sizeof 操作符的操作数可以是类型,也可是变量或者表达式。⽤来计算sizeof的操作符数的类型⻓度的,单位是字节。
扩展:Byte——字节 bit——比特位
1Byte=8bit
1KB=1024Byte
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
……
#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;
}
//后为输出
注意:sizeof 中表达式不计算,在代码进⾏编译的时候,就根据表达式的类型确定了,类型的常⽤,⽽表达式的执⾏却要在 程序运⾏期间才能执⾏,在编译期间已经将sizeof处理掉了,所以在运⾏期间就不会执⾏表达式了。
3.signed 和unsigned
signed 和 unsigned 关键字修饰字符型和整型类型,signed 关键字,表⽰⼀个类型带有正负号,包含负值;unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。
对于 int 类型,默认是带有正负号的,也就是说int 等同于 signed int,int 类型也可以不带正负号,只表⽰⾮负整数。这时就必须使⽤关键字unsigned 声明变量,unsigned int ⾥⾯int 可以省略。声明为 unsigned 的好处是,同样⻓度的内存能够表⽰的最⼤整数值,增⼤了⼀倍。
注意:C语⾔规定 char 类型默认是否带有正负号,由当前系统决定。 这就是说, char 不等同于signed char ,它有可能是signed char ,也有可能是unsigned char ,这⼀点与 int 不同。
4.变量
C语⾔中把经常变化的值称为变量,不变的值称为常量,变量在创建的时候就给⼀个初始值,就叫初始化。语法创建形式为:
data_type name;
| |
数据类型 变量名
变量的分类:
全局变量:在⼤括号外部定义的变量就是全局变量 全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。(不初始化,默认值为0)
局部变量:在⼤括号内部定义的变量就是局部变量 局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤。(不初始化,默认值为随机)
#include <stdio.h>
int global = 2023;//全局变量
int main()
{
int local = 2018;//局部变量
printf("%d\n", local);
printf("%d\n", global);
return 0;
}
当局部变量和全局变量同名的时候,局部变量优先使⽤,全局变量和局部变量在内存中存储如下图所示:(栈区时临时使用的,静态区是可以长期使用的)
5.算术操作符:+、-、*、/、%
算术操作符:分别是: +(加) -(减) * /(C语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。除非两个运算数必须⾄少有⼀个浮点数,这时C语⾔就会进⾏浮点数除法。eg:6.0/4返回值为:1.5) %(求模运算,即返回两个整数相除的余值,结果的正负号由第一个运算数的正负号决定) ,这些操作符都是双⽬操作符。
赋值操作符:=和复合赋值
int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符
c = b = a+3;//连续赋值,从右向左依次赋值的
int a = 10;
a += 3;
a -= 2;//复合赋值符
//常见的有
// += -= *= /= >>= &= <<= |= %= ^=
单⽬操作符:++ -- +(正) -(负)
++是⼀种⾃增的操作符,⼜分为前置++和后置++,--为自减,与++同理。
前置++:先+1,后使⽤
后置++:先使⽤,后+1
int a = 10;
int b = --a;//操作数是a,是放在a的前⾯的,就是前置--
printf("a=%d b=%d\n",a , b);//输出的结果是:9 9
int b = a--;//-的操作数是a,是放在a的后⾯的,就是后置--
printf("a=%d b=%d\n",a , b);//输出的结果是:9 10
6.强制类型转换
eg:int a = (int)3.14;// 意思是将 3.14 double 类型强制类型转换为 int 类型,这种强制类型转换只取整数部分。
7.printf介绍
printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表format (格式化),表⽰可以定制输出⽂本的格式。printf() 可以在输出⽂本中指定占位符。 所谓“占位符”,就是这个位置可以⽤其他值代⼊。
There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要 ⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型,输出⽂本⾥⾯可以使⽤多个占位符,常见的有:
printf() 允许限定占位符的最⼩宽度。
eg:printf("%5d\n", 123); // 输出为 " 123"%5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。 输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个-号。对于⼩数,⼩数的默认显⽰精度是⼩数点后6位,这个限定符会限制所有数字的最⼩显⽰宽度。
printf() 不对正数显⽰ + 号,只对负数显⽰- 号。如果想让正数也输出 + 号,可 以在占位符的 % 后⾯加⼀个 + 。
输出分别为:+12、-12
输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位,占位符可以写 成 %.2f 。
输出为:0.50。这种写法可以与限定宽度占位符,结合使⽤。
最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替。
%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以用%.[m]s 指定输出的⻓度,其中 [m] 代表⼀个数字,表⽰所要输出的⻓度。
8.scanf介绍
们需要给变量输⼊值就可以使⽤scanf 函数,如果需要将变量的值输出在屏幕上的时候可以使⽤ prinf 函数,下⾯看⼀个例⼦:
#include <stdio.h>
int main()
{
int score = 0;
printf("请输入成绩:");
//输入
scanf("%d", &score);
return 0;
}
注意在VS2022中会出现报错情况:
我们可以将错误中的“#define _CRT_SECURE_NO_WARNINGS 1” 置于代码第一行就不会报错啦!
运行结果如下: