1.语句和语句分类
- 语句:我们知道,中文用一个句号,英文用一个点号来结束一句话(表示一句话)。在C语言中,每一行的代码末尾就用
;
结束,表示一句代码(语句)写完。也就是说,每一个;
代表一条语句。代码展示:
int a=10; //表示一条语句
printf("Hello,World"); //表示一条语句
- 语句的分类:可以分为:
空语句,表达式语句,复合语句,控制语句,调用函数语句
- 空语句: 顾名思义,就是这条语句什么实质性的内容也没有(里面啥也没有),就一个光秃秃的
;
。比如;
- 空语句: 顾名思义,就是这条语句什么实质性的内容也没有(里面啥也没有),就一个光秃秃的
; //里面啥也没有,就只有个;,这就是一条空语句
讲到这里,肯定有人心里面产生了疑问,既然空语句什么也不执行,为什么还要有空语句呢?对于这个疑问咱们不在本章节细讲,会在后面进行详细的讲解的。我先简单的讲一下其中一个用途。当我们的程序需要一条空语句且不需要它执行操作的时候,就需要一条空语句。
- 表达式语句:就是这条语句是由表达式所构成的。(是不是有点废话),直接上代码展示:
int a=10; //表达式语句
int b=20; //表达式语句
int c=a+b; //表达式语句
a++ ;//a++的本质就是a=a+1;所以还是表达式语句
也就是说带=
的,就是表达式语句。
- 复合语句:复合语句顾名思义就是语句有点复杂,有点多。其实每个复合语句就是一个就是一个代码块,如代码所示:
#include <stdio.h>
int main() //打印0~122数字的实例代码
{
int i=0; //表达式语句
for(i=0;i<123;i++) //for{}整体就是复合语句
{
printf("i=%d ",i);
}
return 0;
}
其实每个子函数(子程序)也是一个个代码块(复合语句),如代码所示:
#include <stdio.h>
int add(int a,int b) //add子程序就是一个复合语句(代码块)
{
int c=a+b;
return c;
}
int main()
{
printf("计算的结果:%d",add(5,3));
return 0;
}
- 调用函数语句:这个从字面意思就能知道是啥意思,调用函数=调用子程序。如代码所示:
#include <stdio.h>
void Print_f(int arr[],int sz) //自己定一个打印函数(程序)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("arr[i]=%d\n", arr[i]);
}
}
int main()
{
int arr[]={1,2,3,4,5}; //进行数组元素的打印
int sz=sizeof(arr)/sizeof(arr[0]);
Print_f(arr,sz); //调用函数语句
return 0;
}
运行的结果图,如图所示;
- 控制语句:用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:
顺序结构,选择结构,循环结构
),它们有特定的语句定义符组成,C语言有九种控制语句。- 1.条件判断语句也叫分支语句:
if
语句,switch
语句; - 2.循环执行语句:
do while
语句,while
语句,for
语句; - 3.转向语句:
break
语句,goto
语句,return
语句;
return,for
这俩各位前面都见过了吧,至于这些语句具体怎么用,后面我们都会详解的(请各位期待一下吧),
- 1.条件判断语句也叫分支语句:
2.注释是什么?为什么写注释?
- 注释:这玩意儿太重要了,它就是对你所写的代码进行一个标注(解释),我们写完代码后要进行适当的注释。我们用
'//'
来进行注释,'//'
是单行注释,我们在'//'
后面写一些代码的信息,在它后面想写什么就写什么,编译器会自动忽略//
后面的信息——不进行编译。所以//
可以在代码后面写些信息或者注释掉代码(编译器就无法进行编译),还有一个多行注释,用/**/
,来进行多行注释,这种多行注释用来注释代码的(比单行注释代码要快些),一旦注释代码后,编译器就不进行编译,如图代码所示:
int a=10; //对a进行赋值
int b=20; //对b进行赋值
int c=a+b; //a和b相加的值赋给c
// int a=10; //单行注释
/*int g=10; 多行注释
float n=12.3;
*/
进行图片展示—未注释:
进行图片展示—单行注释:
因为我们把// int i=10;
进行了单行注释,所以编译器不进行编译,又因为我们调用了i
,但编译器没有进行编译,所以就报错了。
进行图片展示—多行注释:
- 为什么要写注释呢? 这个问题的答案很简单,就是为了让自己的代码更有可读性。当我们过好了长时间,回过头来看自己写的代码,如果当时我们给自己的代码进行了注释,我们能很快想起来每句代码的意思,反之,我们可能要好半天都无法想起来当时自己写的啥意思。给代码写注释,也为了方便他人进行阅读。我们可以进行换位思考,假如有一天,我们需要一份代码,结果啥注释也没写,那让我们怎么去看明白,对吧!当然注释,不用每行都些(不用想写作文一样),我们要适当的注释。
3.数据类型介绍
- 数据类型:“类型”,就是一些元素所拥有的共同特征,比如,
1,3,45……
这些统称为整数,12.3,1.5……
,这些统称为小数。“数据类型”,也就是对数据进行一个个的分类。只有分类好了(或者知道了数据类型),我们才能更好的对生活中的事物进行准 确的描述,编译器才知道怎样进行操作。 - 数据类型的分类:
本章节中,我们只讲内置类型,至于自定义类型我们后面会进行详细的讲解。内置类 型:就是这些变量(什么是变量,我们下节进行讲解!)类型,C语言中已经给 我们规定好了,我们直接用就OK。自定义类型:虽然C语言中已经给我们规定了那么多种的变量类型,但在描述一些复杂的变量时候,内置类型就无法满足了,就需要我们根据自己的需求自己进行创建变量。(比如,当我们创建一个学生管理平台,描述一个学生的时候,我们不能单一描述他的身高或体重,因为描述一个完整的学生需要很多种变量,这个时候需要自定义类型—结构体)。-----'[]'
内容的东西可以省略不写。-
字符型:
-
整型:
在C99后,C语言新增了更长整形long long
: -
浮点型:
简单进行解读:float
:单精度.double
:双精度。long double
:多精度/长精度。 -
布尔型:这个玩意儿就一个作用—就是用来判断真假的。在C99之前我们判断真假就是——0为假,非0为真。在C99之后,就特地的创建了布尔类型来专门表示真假。
-
#include <stdbool.h> //为布尔型的头文件
_Bool //表示类型一
bool //表示类型二
布尔类型就两个值:true
和false
.
布尔类型的定义;
#define bool _Bool
#define false 0;
#define true 1;
进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdbool.h> //使用布尔类型要包含头文件
int main() //i为假,不会打印Hello World,只会打印False.
{
//_Bool i = false;
bool i = false; //_Bool或bool定义变量i都OK
if (i)
printf("Hello World");
else
printf("False");
return 0;
}
输出的结果图;
当然大家也可以自行改改代码玩一玩,比如,bool i=true;
等。
- 数据类型的长度:这里先给大家讲个东西,我们创建变量的本质就是向内存申请空间,具体申请多大的空间,由变量类型(数据类型)决定。也就是说,每种数据类型都占 有一定空间,不同的数据类型占有的空间大小不同。为了测出每种数据类型占有多少空间,我们引用一个操作符
sizeof
,用它测出每种数据类型的大小,它的单位:字节。- sizeof的介绍:
sizeof
是一个关键字,也是一个操作符(什么是操作符,后面我们会讲解的),专门用来计算数据类型长度的,它的操作数可以是类型或表达式。
- sizeof的介绍:
1.sizeof (类型);
2.sizeof 表达式;
- sizeof(类型) 测得数据类型长度(代码展示) :
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
运行结果图:
- sizeof(表达式):
sizeof
后面的表达式不进行计算----代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 2;
int b = 10;
printf("%d", sizeof(a = a + b));
printf("%d", a);
return 0;
}
运行结果图示:
我们从结果运行图可以看出来,sizeof
后面的表达式并不进行计算。sizeof
后面是表达式时,可以不带()
,而类型要带()
,我建议大家使用sizeof
的时候都带上()
.
- sizeof的返回值类型:不知道大家注意到没?前面,我们在打印
sizeof
的测量的数值时,我们有用占位符%zd
,也用%d
占位符。按理来讲,sizeof
测得的是整数(因为字节都是整数),既然是整数,那就应该用%d
占位符。这就与sizeof
的返回值类型有关。其实,用%zd
或%d
,都OK的。在这里,主要是想讲一下%zd
的来源:
4.signed和unsigned
- signed&unsigned: 前者是表示有符号,后者表示无符号。前面咱们讲数据类型的时候,大家都见过了。
signed
有符号,表示书写或打印的信息可以带+,-号(+可以省 略),比如,(signed)int a=10 /-10;
。unsigned
无符号,它表示的数值类型不可以带符号,也就是说只能表示正数。 - signed和unsigned的区别:
-
数值取值的范围不同:
同一种数据类型中(占有相同的字节长度),unsigned
能够表示的最大整数比signed
要大一倍。比如,16位的signed short int
的取值范围:-32768~32767,最大是32767;而unsigned short int
的取值范围是:0~65535,最大值增大到了65535。很明显,相同长度内,unsigned
表示的最大整数比signed
的大多了。具体的范围可以打开limits.h
这个头文件。 -
数据储存的方式不同:
对于整数的存储,在计算机里是以补码的形式存储的,有符号位和无符号位是两种截然不同的存储方式-----后面我们会细讲,本章点到为止。 -
因为char而不同:前面,我们讲过
[signed]
,可以省略不写----->signed int =int
.但这种方式,对于char
,不一定成立,即:signed char 不一定等于 char
.原因很简单,这是因为在不同的编译器中,规定不同。但大多数编译器都是默认signed char =char
。------想 提醒一下大家,char是个特例。
-
5.数据类型的取值范围
上述的数据类型很多,尤其整型类型就有short、int、long、long long
四种,为什么呢?
其实每⼀种数据类型有自己的取值范围,也就是存储的数值的最大值和最小值的区间,有了丰富的类型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系 统上不同数据类型的极限值:limits.h
文件中说明了整型类型的取值范围。float.h
这个头文件中说明了浮点型类型的取值范围。为了代码的可移植性,需要知道某种整数类 型的极限值时,应该尽量使用这些常量。
• SCHAR_MIN , SCHAR_MAX
:signed char
的最小值和最大值。
• SHRT_MIN , SHRT_MAX
:short
的最小值和最大值。
• INT_MIN , INT_MAX
:int
的最小值和最大值。
• LONG_MIN , LONG_MAX
:long
的最小值和最大值。
•LLONG_MIN , LLONG_MAX
:long long
的最小值和最大值。
• UCHAR_MAX
:unsigned char
的最大值。
• USHRT_MAX
:unsigned short
的最大值。
• UINT_MAX
:unsigned int
的最大值。
• ULONG_MAX
:unsigned long
的最大值。
• ULLONG_MAX
:unsigned long long
的最大值。
当我们想使用这些最大值或最小值时,我们可以写数字,也可以写它们的宏定义, 比如:
#include <limits.h> //使用这些宏定义的时候要包含头文件。
i < 127;---等价于---- i < SCHAR_MAX ;
6.点个彩蛋送给自己吧!!!
https://www.bilibili.com/video/BV13o4y137ct/?spm_id_from=333.337.search-card.all.click&vd_source=7d0d6d43e38f977d947fffdf92c1dfad
每章一句:‘你的日积月累,早晚会成为别人的忘尘莫及’
。感谢各位看到这里,希望你们能有所收获,点赞+关注+收藏是对我最大的鼓励,咱们下期见啦,拜拜各位!!!