判断
判断语句也叫作分支结构
之前扯到过三目运算符这里可以先回忆一下,三目运算的使用
语法: 逻辑表达式?执行语句1:执行语句2;(不要忘记了这个分号)
int a = 10, b = 10;
a==b ? printf("他们两个相等
") : printf("他们两个不等
");
实际上三目运算或者叫条件运算或叫三元运算。反正都是说的这个有三个符号的运算式子就是一个简单的ifelse语句。
if else
条件判断语句
if(逻辑表达式){
执行语句;
}else{
执行语句;
}
if里的逻辑表达式结果是非零数的时候才会执行if里的语句否则执行else里的语句
实例代码
#include <stdio.h>
int main(){
int a = 50,b = 90;
if(a==b){
printf("他们两个相等
");
}else{
printf("他们两个bububu相等
");
}
return 0;
}
如果 简单的逻辑判断,或者说只有一个,判断条件,直接用三元还是比较简单
这里我们需要知道,一个if和一个else配对,他们是就近原则也就说,if会和离他最近的一个else匹配,当然这个else必须是在if的下面哈,不然else if都找不到匹配的对象了。当然,做单独判断的时候也能只用if,但是不能只用else
例如下面代码
#include <stdio.h>
int main(){
int a = 80;
if(a>60){
printf("a是大于60的
");
}
if(a>90){
printf("b是大于90的
");
}
if(a>70){
printf("c是大于70的
");
}
return 0;
}
顺序结构运行,从上到下,从左到右,只要满足所有的if里的条件,都会执行if里的语句的。但是这样做就会减低逻辑判断的效率。例如这里的每个if里都会判断是否满足括号里的条件。然后满足第一个和最后一个if,所以会执行第一个和最后一个if里的语句
这里没有用到else语句,如果在末尾条件一个else语句呢?那么会和最近的if匹配,则是和if(a>70)的相匹配具体看一下代码。
#include <stdio.h>
int main(){
int a = 80;
if(a>60){
printf("a是大于60的
");
}
if(a>90){
printf("b是大于90的
");
}
if(a>70){
printf("c是大于70的
");
}
else{
printf("我是和楼上匹配的");
}
return 0;
}
else if
这个else if是啥呢?也就是穿插到if else里的一个判断语句,因为有时候我们可能要判断的条件不止一个,例如我们判断老王的成绩。这里就用a变量代表一个科目,直接上代码:
#include <stdio.h>
int main(){
int a = 80;
if(a>60){
printf("a是大于60的
");
}else if(a>90){
printf("b是大于90的
");
}else if(a>70){
printf("c是大于70的
");
}else{
printf("都是小于60的");
}
return 0;
}
剖析代码:
程序是从上到下,从左到右进行编译的。在知道了a = 80 后,首先对第一个if进行判断。然后如果满足条件,则直接执行if里的语句,且不会再执行后面else if里的语句了 ;如果不满足,则看后面的else if里的条件,如果满足,则执行里面的语句且不会再判断的else if里的条件是否满足语句。如果不满足,则接着找后面的分支语句(if 或者else 或者else if)
注意:else if 使用的时候之前必须要有if条件判断,不能直接就来else if
也就说 else if 是单独穿插在if else里的一个条件判断分支语句
重点理解:如果上面的文字或者代码理解不了。就看这里,一定要知道。只使用if 判断的时候,会将出现所有if里的条件进行判断。如果使用了else if 的时候,则只满足了第一个条件后,后面的分支语句就不再执行了;
代码一:
#include <stdio.h>
int main(){
int a = 1;
if (a>0){
a++;
}
if (a>0){
a++;
}
printf("a的值是:%d
",a);
return 0;
}
代码2:
#include <stdio.h>
int main(){
int a = 1;
if (a>0){
a++;
}
else if (a>0){
a++;
}
printf("a的值是:%d
",a);
return 0;
}
当if{}里的代码只有一条语句的时候,可以省略{}else也是
代码:
#include <stdio.h>
int main(){
int a = -1;//这里是不满足if里的条件的,则会执行else 里的语句
if (a>0)
printf("我是if里的执行语句");
else
printf("我是else里的执行语句");
return 0;
}
if嵌套
if也是能嵌套使用的,也就是说,比如我们要判断一男人是不是高富帅,首先要判断一个男的是不是很高,然后在判断是不是很富有,然后在判断是不是帅,你可能会这样用
直接三个if来判断呗。我们用代码来看看
#include <stdio.h>
int main(){
//0代表高,1代表富,2代表帅
int man=1;
if(man==0){
printf("高
");
}
if(man==1){
printf("富
");
}
if(man==2){
printf("帅
");
}
return 0;
}
但是生活中的高富帅不是这样的,而是又高又富又帅。以上的写法是如果是高就是高,如果是富就是富,如果是帅就帅,但是这样判断是比较繁琐的。首先我们的高富帅就是要有个前提。必须先要高。有了高,才能有判断富和帅的资格,不然不够高,连判断富和帅的资格都没有。
所以需要用到if的嵌套
if(man==0){
if(man == 1){
if (man == 2){
printf("高富帅
");
}
}
}
这样就更加的严谨
switch
语法规则:
switch(整型或者枚举型){
case要比较的值:
break;
case要比较的值:break;
default:在上面的case都不满足条件的时候执行,类似于if中的else
}
代码示例:判断输入1到7表示是星期几
#include <stdio.h>
int main(){
int a = 0 ;
printf("请输入您要判断是日期的数字:");
scanf("%d",&a);
switch(a){
case 1:
printf("星期一
");
break;
case 2:
printf("星期二
");
break;
case 3:
printf("星期三
");
break;
case 4:
printf("星期四
");
break;
case 5:
printf("星期五
");
break;
case 6:
printf("星期六
");
break;
case 7:
printf("星期七
");
break;
default:
printf("输入信息错误");
break;
}
return 0;
}
break:跳出当前循环以当前的switch的意思。如果不好理解,就直接记住,每个case和default的执行语句后面都添加一个break;
循环
一般有for循环 while循环 do while循环
for循环
语法 :
int i = 0;定义循环控制体
for(i;循环条件;循环控制体改变){
循环语句;
}
代码:打印10次我好帅
#include <stdio.h>
int main (){
int i = 0 ;
for ( i;i<10;i++){
printf("我好帅
");
}
return 0;
}
代码剖析:
首先定义了一个变量 i ;然后执行for循环里的括号里的语句,第一分号前面的i也就是for循环里的计数器,后面的判断以及控制都是针对这个控制体进行的,第二个分号前面的就是判断语句,只有结果是真也就是返回值是一个非零数才会执行第二个分号后面的内容,如果是个非零数,则操作第二个分号后面的语句,对控制体进行操作。然后再执行循语句
只有当for括号里的条件都是满足循环条件的时候才会执行循环语句
while循环
语法:
while(判断条件){
循环语句
}
只有当判断条件是true时才会执行循环语句;否则不会执行
上代码:
打印10次我好帅
#include <stdio.h>
int main (){
int i = 0 ;
while(i<10){
if (i==5){
break;
}
printf("我好帅
");
i++;
}
return 0;
}
这里需要注意,while括号里的 条件语句如果定义本来就是一个true,则会出现死循环。也就是说。是控制体是个变量,而不是一个常量。当然在循环语句里会对控制体进行操作,对i进行自增,然后增加到不满足括号里的条件,则就退出循环了;
这里也是用了break语句,则在i 自增到==5的时候,满足if的条件判断,则会执行break语句。这里不是会退出if哈,而是会直接结束当前循环,也就是说直接退出while循环,当然break用在其他循环里也是一样,直接结束的当前循环。很适合退出循环以及循环嵌套里使用;
do while循环
这比while循环多另一个do。现在看看如何使用
语法:
do{
循环语句
}while(循环条件);
这里记住,这个while后面是有一个分号的,当然do while循环也是有区别的。do while会先执行一次在进行while括号里的判断,如果是括号里是真,则接着运行循环语句。而while循环是只有在满足括号里的判断条件才会执行循环体。也就是说。do while循环会至少执行一次
上代码:
打印10次我好帅
#include <stdio.h>
int main (){
int i = 0 ;
do{
printf("我好帅
");
i++;
}while(i<10);
return 0;
}
这里解释一下,这里是dowhile循环,{}里的执行语句,是首先就执行一次了的。也就说,第一次的我好帅是不管满足while条件真假都会执行的。 而且这里也执行了i++,所以i到while括号哪里的时候是1,然后后面循环其实是只循环了9次。然后加上第一次无条件执行的一次打印,才是10次。
循环嵌套
当然分支语句都能嵌套,循环语句也是能嵌套滴。这里以for循环做实例,打印常见的九九身发表。记住外层循环是行,内循环是列。
上代码:
#include <stdio.h>
int main (){
int i , j;
for (i = 1 ;i<=9; i ++){
for (j = 1; j <= i ; j++){
printf("%d*%d=%d ",j,i,(i*j));//打印每列分隔 所以是行*列
}
printf("
");//打印每行 换行
}
return 0;
}
记住外行内列
函数
函数可以说是c语言除了指针后的精髓了。用c写的程序都是用函数来构成的。每个c程序都有一个函数 就是主函数main(),这里我也说一下c的目录结构。
一般我们创建项目的时候都是直接创建一个工程(项目)然后在工程的源码文件里编写.c文件,但是很神奇的来了。每个工程只能有一个还有main函数即主函数的.c文档。而且更神奇的来了。每个.c文件是可以互相调用函数的也就说,一个c程序(工程)都是用函数组成的,且互相调用来实现不同的功能,比如我要实现一个查询,则需要用到查询的时候调用写了查询的.c文件里的查询函数。就这样实现了一个c程序。当然这样也就有了结构思想了。
函数也叫方法,但是c里面还是叫函数好些。毕竟方法和函数其实还是有一点不同的。方法是比较特殊的函数,这个和面向对象有点挂钩了。
定义函数
首先看看我们定义main函数的 时候 是怎么定义的
int main (){
return 0;
}
-
这里的int则是函数的返回类型,main是函数名,c里规定了,函数名是main是c里的主函数是有且仅有一个的,如果出现了第二个main,那么则会报错。{}是函数体里的内容。这里面写了一个return 0;意思是调用该函数会有一个返回值是0;
-
其实我们并没有使用到这个返回值。那么可以不用写吗?在main函数里其实是可以的,但是如果是其他自定义的函数,则会出现异常。
-
其实函数的返回值类型也就是基本数据类型。看你具体想要返回的返回值是什么,就给该函数定义什么返回值类型。
-
当然如果又不想要返回之类型的呢?你可以定义函数的返回值类型是void 。比如 voie main()也是可以的。但是这种执行效率比较低。不建议使用
默认定义的函数可以说是外部函数,因为外部的.c文件可以调用。如果你想自己使用,那么就使用static修饰,如果使用了static的修饰函数,那么这个函数就不能被外部访问,只能在当前.c文件里被调用
声明函数
人为规定需要声明的,其实不用声明也是可以的,但是规范还是得声明
- 和声明变量很相似。在函数体内声明,叫做局部,在函数体外部声明,叫做全局。声明函数的目的是告诉编译器,有这个函数,要去找到这个函数,也就是说,必须要定义了这个函数,才能通过声明找到这个函数。
- 在c里,默认声明是使用了extern关键字的。(extern是外部的意思),也就是说。在声明函数的.c文档里没有发现定义好的这个函数,会在同工程的源文件目录下的其他.c文件里寻找这个函数的定义(定义也就是实现)
- 如果声明的函数此.c文档例没有,其他.c文档例也没有,不会报错。只是告诉了编译器我这里声明了一个函数名叫啥,返回值是啥以及有没有参数的的声明。这个和声明变量很类似。告诉编译器,我有一个变量。等哈要用的时候就能通过变量名来找到
调用函数
重点在加粗文字。其他的看看就是了
好吧,我知道字太多,你不想看,调用函数就是 :函数名 (是否带参);
也就是使用函数。这里和使用的编译器有关。我这里是使用的vc6.0 32位的编译器。其他 的我就不清楚了。
先说说常规的定义、声明、使用函数的方式吧
这里通过名字顺序就得知道。首先必须先定义函数,然后在声明函数,然后在调用函数。定义函数也就是创建函数。当然这个创建函数的位置,可以是单独的一个.c文件,也可以是一个.c文件里创建多个函数都是可以的。良好的操作编码习惯应该是分功能来把函数放在不同的.c文件里。这里提到了.c文件。所有的.c文件叫做源码文件,当然你会发现你的工程里有.h文件,这个.h文件是放在头文件目录里的。这个.h和创建.c文件的时候写的#include <stdio.h>有啥子关系呢?因为这里用到了stdio.h嘛。这个<>里的内容其实也就是通过引用头文件的方式来调用c的库。当然.h文件里的就是你要写的一些通用的函数咯,然后这个.h文件就叫做库。也叫作头文件。
ok。回到主题,调用函数,我们已经定义了一个函数,按照规范,我们应该声明函数再调用函数的。这里看代码
我这里创建了一个demo01.c文件。里面只有一个demo()函数,这个domo01函数是用来表示指针取值的,这个demo函数是没有参数的。返回值类型是int
#include <stdio.h>
int demo01(){
int a=2;
int *p=&a;
printf("%d
",*p);//间接取值
printf("%d
",a);
return 0;
}
具体代码先不管,这里就是定义了一个函数了。然后我们在创建一个名字是demoMain.c文件。里面有一个main函数,这个.c文件就作文主函数文件咯,看代码
#include <stdio.h>
int demo055();//声明一个没定义的函数
int demo01();//全局声明demo01函数
int main (){
int a = demo01();
printf("a的值也就是demo01的返回值是:%d
",a);
demo01();//调用demo01函数
return 0;
}
- 这里可以了解到。声明一个没定义的函数,而且没调用这个没定义的函数是不会报错的。
- 从这里也可以看到,声明函数的时候默认是带有extern关键字的。因为它调用了另一个.c里的函数
- 声明函数的方式就是 ,函数的返回值类型 函数名 (是不是带参的)也就是定义函数的时候怎么做的就怎么写
- 调用函数的时候,如果需要接收该函数的返回值,则定义一个同类型的变量来接受即可。例如这里的a。但是接受函数返回值的时候还是会调用一次函数的,这里的a的值,也就是我们在定义函数的时候return(返回)的值
- 如果不需要接受函数的return值,那么直接函数名 (是否带参);就能调用函数咯
带参函数和不带参函数
- 带参函数即括号里存在参数
- 不带参函数即括号里没有参数,比如我们平时创建的main主函数,是不带参数滴
实参和形参
实参
也就是实际参数。简单来说,比如你要调用一个带有两个参的函数,你当然需要传入两个值,这两个个值可能就是你当前定义的变量或者常量值,直接将你当前定义的这两个值放在你调用函数的括号里,那么这个括号里的参数,就是实参;比如我现在在调用带参函数:
int a = 1, b = 2 ;
max(a,b);
这个括号里 a 和b就是实参
形参
也就会形式参数,也就是走个形式。形参和局部变量一样,在调用函数的时候创建,执行函数结束后销毁。在定义函数的时候那个括号里的参数,就叫形参
看代码,这里定义带有两个参数的函数max(a,b)
int max(a,b){return (a+b);}
这个return的值就是a+b的值,也就计算传入两个数的和。然后调用这个函数的时候会返回这个和的结果。
占位符扩展
- %d, %i 代表整数
- %f 浮点
- %s 字符串
- %c char
- %p 指针|地址
- %fL 长log
- %e 科学计数
- %g 小数或科学计数。
- %a,%A 读入一个浮点值(仅C99有效)。
- %c 读入一个字符。
- %d 读入十进制整数。
- %i 读入十进制,八进制,十六进制整数。
- %o 读入八进制整数。
- %x,%X 读入十六进制整数。
- %s 读入一个字符串,遇空格、制表符或换行符结束。
- %f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
- %p 读入一个指针。
- %u 读入一个无符号十进制整数。
- %n 至此已读入值的等价字符数。
- %[] 扫描字符集合。
- %% 读 % 符号