上篇我们讲解了变量、常量、字符串、转义字符、注释。那么我们继续来学习C语言的一些基本知识,同样,知识也是点到为止,不会很深入,后面我会发布更深层次的知识。(注:本篇的内容稍稍有点多,大家可以分批学习)
1.选择语句
在C语言中有时有多种分支,我们就需要用到选择语句
在C语言中有两种常见的选择语句:if语句、switch语句,本篇先来学习if语句
1.1if语句:
- 语法结构
if(//表达式1){ //语句1;} elseif(//表达式2){ //语句2;} else//语句3;
我们这里要注意,如果if、else if、else后面有多条语句就得加上{},如果只有一条语句可以不用加{},另外else if可以使用多次用来进行多个选择
我们来写一串代码来实现选择语句:
intmain() { intinput=0; //进行选择 printf("你要学好C语言吗?(1 or 0)\n"); //输入 scanf("%d", &input); //选择语句 if (input==1) //要注意这里使用的是==,意思是如果input等于1则执行下面的语句 { //输出printf("你可以得到好offer\n"); } else//这里是input不等于1的情况,则执行下面的语句 { //输出printf("另寻出路吧!\n"); } return0; }
1.2注意事项:
- if语句里面的表达式如果要判断相不相等一定要使用==
- 如果if、else后面有多条语句得加上{}
- 如果要判断多个条件可以使用多次else if
2.循环语句
循环很好理解,就比如我们日复一日的学习,老师日复一日的讲课...等等
那在C语言中怎么样实现循环呢?
在C语言中的循环语句有while循环;for循环,do while循环
本篇我们先来介绍while循环
2.1while循环:
- 语法结构
while(//表达式){ //循环语句;}
我们用代码来表示一下:
比如:跟着我学C语言,每天都要敲代码,当你敲了20000行有效代码时,你将会有一个好的offer
intmain() { printf("跟着我学习C语言\n"); intline=0; //设置循环:当line小于20000时进入这个循环while (line<20000) { printf("敲代码:%d\n",line); line++; //这里的意思表示line每次进来之后都会+1 } if (line>=20000) //当line大于等于20000之后跳出上面的循环进入这个选择语句中printf("你将会得到一个好offer\n"); return0; }
3.函数
函数能够使用一个独立的功能
我们在初识C语言(2)里面在讲注释的时候使用了一串代码就是使用函数来求两个数的和
- 不用函数来写两个数的求和:
intmain() { inta=0; intb=0; intsum=0; //输入printf("请输入两个整数\n"); scanf("%d %d", &a, &b); //计算sum=a+b; //输出printf("sum=%d\n", sum); return0; }
当我们在一个工程里写很多加法运算的时候,如果每次使用这种写法会很麻烦,这时候就要使用函数
- 用函数写两个数的求和:
//这里设置这个用来求和的函数AddintAdd(intx, inty) //由于输入的是整形,所以函数类型也应该为整形{ //在函数里面设置两个整形x,y来接收a,bintz=x+y; //这里用z来表示两个数的和returnz; //这里返回值是z,是因为当我们计算出a,b的和将它存放在z里面,将它返回} //我们的sum,从而打印输出intmain() { inta=0; intb=0; intsum=0; printf("请输入两个整数\n"); //输入scanf("%d %d", &a, &b); //求和sum=Add(a, b); //这里使用一个函数Add,将输入的a,b放进函数Add中 //然后设置一个sum变量来存放计算出的值//输出printf("sum=%d\n", sum); return0; }
函数的特点就是简化代码,代码复用
说到这里还有老铁不理解的话我们来画一个图来展示一下:
函数的功能就好比一个工厂,我们只需要把原材料给工厂,然后通过工厂的加工来得到我们需要的东西
由上面的函数求和的例子来说明函数的一些基本组成
4.数组
要存储1~10的数字,该怎么储存呢?
数组从简单方面理解就是一堆数字组合起来,但是C语言中有明确定义
4.1数组的定义:
数组:一组相同类型元素的集合
intarr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
4.2数组的下标:
- C语言规定:数组的每个元素都有一个下标,下标是从0开始的
intarr[10] = {1,2,3,4,5,6,7,8,9,10}; //下标 0 1 2 3 4 5 6 7 8 9 //假设n是元素个数,那么它的下标的范围是0~n-1
- 使用下标的方式访问元素
arr [//下标];
假设一个数组里面有10个元素,我们需要找到下标为5的元素
intmain() { intarr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("%d\n", arr[5]); return0; }
我们可以很直观的看到,我们打印下标为5的元素就可以得到6
4.3数组的使用:
当我们给定了一组数组,我们需要把这组数全部打印出来,我们需要如何做呢?
按照我们以前的方法,我们可以使用查找下标的方法依次将他们打印,但是非常麻烦
但是我们可以使用我们前面学过的while循环,我们可以先找元素下标为0的元素,然后依次下标+1,从而循环打印出整个数组
intmain() { intarr[10] = { 1,2,3,4,5,6,7,8,9,10 }; inti=0; //这里设置一个循环变量while (i<10) //while循环开始:当i<10时,循环开始 { printf("%d ", arr[i]); //在这里刚刚进来的i是0,所以打印的下标为0的元素i++; //在这里i+1,每次进来都会加1,直到加到10//则不满足whiel循环的条件则会跳出循环 } return0; }
5.操作符
关于操作符在初识C语言里只是简单介绍,后面的文章会详细介绍
5.1算数操作符:
+ |
- |
* |
/ |
% |
//a+b a-b a*b a/b a%b
关于算数操作符,有几点要注意:
%:这个是取模(取余)
当使用A%B时要注意,%两边都得是整数
//5%2=1
当使用A/B时要注意,如果两边都为整数,则计算出的结果是整数,如果两边有一个是小数,则计算出的结果是小数
//5/2 = 2//5.0/2 = 2.5//5.0/2.0 = 2.5
5.2移位操作符(移动的是二进制位):
>> |
<< |
后面会发布文章介绍
5.3位操作符(操作的是二进制位):
& |
^ |
| |
后面会发布文章介绍
5.4赋值操作符:
= |
+= |
-= |
/= |
*= |
&= |
|= |
<<= |
>>= |
这里我们只讲前面五个
= :这里是赋值的意思,就比如a=5,是把5赋值给a
+= :a += 5 这里的意思是给a加上5再赋值给a,比如原本a = 0,那么a+ =5之后a=5
-= 、*=、/=都是同样的道理
5.5单目操作符:
- 单目指的就是操作符两边只有一个操作数
! |
逻辑反操作 |
- |
负值 |
+ |
正值 |
& |
取地址 |
sizeof |
操作数的类型长度(以字节位单位) |
~ |
对一个数的二进制位按位取反 |
-- |
分为前置、后置 |
++ |
分为前置、后置 |
* |
间接访问操作符(解引用操作符) |
(类型) |
强制转换类型 |
在C语言中0表示假,非0表示真
在这里我们讲一下sizeof和--、++
5.5.1sizeof:
sizeof:可以用来计算变量、类型所占空间的大小(以字节为单位)
intmain() { inta=10; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(int)); return0; }
计算出的结果都是4个字节
了解到这里我们可以计算出一个字符串里面有多少个字符
intmain() { intarr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("%d\n", sizeof(arr)); //计算的是整个字符串的总的大小 40个字节printf("%d\n", sizeof(arr[0])); //计算的是一个字符的大小intsz=sizeof(arr) /sizeof(arr[0]); //计算出这个字符串里面有多少个字符printf("%d\n", sz); return0; }
我们再来了解一个前面提到过的知识:strlen
strlen是一个计算字符串长度的函数,使用时要包含头文件#include<string.h>
intmain() { chararr[] ="abcdef"; printf("%d\n", strlen(arr)); //?printf("%d\n", sizeof(arr)); //?return0; }
那这里打印出来为什么是6、7呢?
是因为:
sizeof计算的是所占内存空间的大小,不在乎内存里面放的是什么,单位是字节
strlen统计的是\0之前的字符的个数,所以不包含\0
在这个字符串里面有abcdef\0这7个字符,所以用strlen来统计时是6,不统计\0,而用sizeof来计算时,它不管这个字符串里面放的是什么,统统都计算,所以计算出来的大小是7.
5.5.2++、--:
++、--可以分为两类:前置和后置
先来了解后置++:
后置++的意思就是先使用,后++
intmain() { inta=2; //这里简单解读一下intc=0; c=a++; //c=a;a=a++;printf("c=%d a=%d\n", c, a); return0; }
这里的a++类似于我们前面见到过的line++,就是在a的基础上+1再赋值给a,这里的后置++就是先把a的值使用赋值给c,然后a再++赋值给a,所以c=2,a=3.
前置++:先++,再使用
intmain() { inta=2; intc=0; c=++a; //c=a++,a=a++printf("c=%d a=%d\n", c, a); return0; }
前置++,先++,再使用,意思就是:先给a++,然后使用赋值给c,所以c=3,a=3.
前置++和前置--意思一致,后置++和后置--意思也一致。
5.6关系操作符:
> |
用于测试“大于” |
>= |
用于测试“大于等于” |
< |
用于测试“小于” |
<= |
用于测试“小于等于” |
== |
用于测试“相等” |
!= |
用于测试“不相等” |
注:要注意区分“==”和“=”,前者是相等,后者是赋值
5.7逻辑操作符:
&& |
逻辑与(并且) |
|| |
逻辑或(或者) |
我们定义0~18岁为未成年,18~28岁为青年,28~45岁为中年,45岁以上为老年
我们可以用代码来表示一下:
intmain() { intage=0; scanf("%d", &age); if (age>=0&&age<=18) //逻辑与操作符:两边的条件同时满足才可以执行 { printf("未成年\n"); } elseif (age>18&&age<=28) printf("青年\n"); elseif (age>28&&age<=45) printf("中年\n"); elseprintf("老年\n"); return0; }
逻辑与操作符类似于并且,A并且B
intmain() { intnum=0; scanf("%d", &num); if (num==5||num==10) //逻辑或操作符:只要满足两边任何一个条件便可以执行printf("hehe\n"); elseprintf("haha\n"); return0; }
逻辑或操作符类似于或者,A或者B
5.8条件操作符:
exp1 ? exp2: exp3 |
简单介绍这个操作符的意思:exp1成立吗?,如果成立,则执行exp2,如果不成立,则执行exp3
这个也叫三目操作符
使用三目操作符来比较两个数的大小:
intmain() { inta=0; intb=0; scanf("%d %d", &a, &b); //在输入的时候两个数中间要有空格printf("MAX= %d", a>b?a : b); //如果a>b成立,则执行a,如果不成立,则执行breturn0; }
5.9逗号表达式:
exp1, exp2, exp3, ..... expn |
逗号表达式会从左向右依次计算,整个表达式的结果是最后一个表达式的结果
代码演示:
intmain() { inta=3; intb=5; intc=0; intd= (a+=3, b-=a, c-2); printf("%d\n", d); return0; }
我们来分析一下这个代码:a+=3的意思是给a+3再赋值给a,所以a=3+3=6。b-=a的意思是给b-a再赋值给b,所以b=5-6=-1。c-2=-2,所以打印出的结果就是-2。
因为逗号表达式最后打印的是最后一个表达式的结果,那么我们是不是不用管前面的表达式,直接去计算最后一个表达式呢?
可不敢这样去想,如果前面有一个表达式改变了最后一个表达式的值,那么还这样计算就出现bug,我们来看一个代码:
intmain() { inta=3; intb=5; intc=0; intd= (a+=3, b-=a, c=a+b, c-2); printf("%d\n", d); return0; }
如果我们只计算最后一个表达式的结果:c-2的出的结果是-2,那可就错了,因为前面有一个表达式改变了c的值,所以可不敢贸然去计算,如果从左向右依次计算:a+=3,所以a=6。b-=a,所以b=-1。c=a+b,所以c=5。c-2,所以最终结果c=3,这样就对了。
5.10下标引用、函数调用、结构成员操作符:
[ ] |
( ) |
. |
-> |
我们这里只讲前两个
5.10.1下标引用操作符:
下标引用操作符在前面的数组的下标中提到过,我们在使用元素下标可以找到该元素时就采用的"[ ]"
intmain() { chararr[10] = { 1,2,3,4,5,6,7,8 };//不完全初始化:设置的字符串里面一共有10个元素//但是我只写了8个元素,剩下的元素默认初始化都是0printf("%d", arr[5]); //下标引用,找下标为5的元素return0; }
5.10.2函数调用操作符:
在使用函数时需要用到"( )"
//包含头文件可不敢忘记intmain() { intlen=0; len=strlen("abcd"); printf("%d\n", len); return0; }
可以看到我们在使用strlen函数求这个字符串的长度时使用了“()”,在使用其他函数时也是同样的道理。
本篇的分享到此为止,大家可以慢慢学习,最后感谢大家阅览,如果有什么不足和疑问可以私信我或者打在评论区,感谢大家!