赞
踩
目录
Hello,大家好。这里是混子卷王,本文的主要内容是介绍C语言中的分支和循环语句以及分享我在“回炉打磨”C语言时的新感悟与新发现。有些体会可能大多数人可能觉得很简单,但相信有些同学会遇见这些疑问。
相信大多数同学都对分支语句有了一定的了解,下面我们就来逐一介绍:
if语句主要是用来实现选择语句和分支语句
主要形式为:
if( 表达式 )
语句
只要表达式的结果为真,就执行下面的语句,语句可以是一句也可以是多句,值得一提的是,如果执行的是多语句的代码块时,必须在if后加{ 语句 },加上{ }的if语句也具有更加清晰的可阅读性和条理性,我们要注重在编程时的代码规范。
举例说明:输入一个数,如果比10大就输出“我比10大”
当输入的a>10时,if中的表达式为真,就会执行下面的打印语句,但如果a<10的话,就不会执行下面的打印语句。
- #include<stdio.h>
-
- int main()
- {
-
- int a = 0;
- scanf("%d",&a);
- if(a > 10)
- {
- printf("我比10大");
- }
-
- return 0;
- }
在使用if语句时,我们也可以使用else-if语句进行多重判断
- #include<stdio.h>
-
- int main()
- {
-
- int a = 0;
- scanf("%d",&a);
- if(a > 10)
- {
- printf("我比10大");
- }
- else if(a < 10)//else语句进行多重判断
- {
- printf("我比10小");
- }
- else//除了a>10和a<10只剩a=10一种情况
- {
- printf("我就等于10 ");
- }
-
- return 0;
- }
如果有多个if和else ,else总是和最近的if匹配
大家不妨猜一下下面的程序运行的结果:
- int a = 0;
- int b = 2;
- if(a == 1)
- if (b == 2)
- printf("hehe\n");
- else
- printf("haha\n");
这个程序其实是没有输出的,为了混淆大家,混子特意把判断a的if语句和后面的else放到同一列的位置,但实际上else是和判断b的最近的if匹配的,由于a=0,if判断语句为假,后面的语句实际上是没有被执行的。
从上面给出的代码案例中我们可以观察到,在判断变量的值是否等于一个常量时用的都是==,当代码是if(a = 1)时,其实运行的结果是hehe的,这是为什么呢?
单个等号 =
是赋值操作符,而不是相等比较操作符。
在这个表达式中,a
被赋值为 1,然后整个赋值表达式的值就是赋给 a
的值,也就是 1。因此,整个判断表达式的结果就是真。
正确的相等比较应该使用双等号 ==
,即 if (a == 5)
才能正确进行判断。
为了防止出现这种错误,我们可以采用if( 常量 == 变量)的方式,因为这种情况编译器会自动报错,可以提醒大家采用双等的方式判断,而变量=常量这种写法系统是不会报错的。
表达式1 ? 表达式2 :表达式3
这是一个三目操作符,接收三个操作数
当表达式1为真的时候就执行表达式2,否则就执行表达式3
其实这个语句就相当是一个if语句
- if(表达式1)
- {
- 表达式2;
- }
- else
- {
- 表达式3;
- }
c语言总是先对左侧的表达式求值再对右边的表达式求值,如果左边的表达式满足逻辑运算符的条件就不再对右侧的表达式求值,这种情况就成为短路
比如:表达式1 && 表达式2,当表达式1已经判断为假时,后面的表达式不再进行计算
表达式1 || 表达式2,当表达式1已经判断为真时,后面的表达式就不再计算
下面我们来看一下一个经典案例:
- int i = 0, a = 0, b = 2, c = 3, d = 4;
- i = a++ && ++b && d++;
- printf("%d %d %d %d\n", a, b, c, d);
- printf("%d", i);
此次程序运行的结果为1,2,3,4,0,因为a++的值为0,所以后面的语句都不在继续执行。相信很多同学都会有这样一个疑问,a++不是等于1吗?为什么是等于0呢?
下面我们就来讲解一下关于前置++和后置++的问题
当我们进行编程的学习时,总是会碰见++i和i++两种语句,那么他们之间有什么区别呢,结果又为什么不同呢?
不管前置还是后置,都是加一,
前置++是先加一,再使用,说白了就是:假如int a=5;int b=++a;
++a拆分就是a=a+1;b=a
而a++是b=a;a=a+1;
所以二者的结果会有不同,相信这也是平时可能会被大家忽略的问题。
有时判断语句有多种情况时,使用if会显得非常的繁琐而且很多大括号让人眼花缭乱,经常找不到配对的if和else,所以我们就引入了switch语句,switch语句是一个多分支选择语句,具体形式如下:
- switch(表达式)
- {
- case 常量1 :
- 语句1;
- break;
- case 常量2 :
- 语句2;
- break;
-
- default :
- 语句n;//处理所有case都不符合的情况
- break;
case 后面跟的是switch后的表达式的值,然后执行语句,然后break跳出。
下面我们来解决一个经典问题,判断今天是星期几的问题:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include <stdio.h>
- int main()
- {
- int day = 0;
- printf("请输入一个数字\n");
- scanf("%d", &day); //用户输入day的值
- switch (day)
- {
- case 1: printf("星期一\n");
- break;
- case 2: printf("星期二\n");
- break;
- case 3: printf("星期三\n");
- break;
- case 4: printf("星期四\n");
- break;
- case 5: printf("星期五\n");
- break;
- case 6: printf("星期六\n");
- break;
- case 7: printf("星期天\n");
- break;
- default: printf("输入的数字错误");
- break;
- }
- return 0;
- }
当输入的数字不是case后面的值时,就会输出“输入的数字错误”。
while的语法结构:
- while(条件表达式)
- {
- //循环体代码
- }
在条件表达式为真的时候,循环执行下面的循环体代码,直到表达式为假,退出循环
需要注意的是while条件表达式中的边界条件
- //输出5次我是混子卷王
- int main()
- {
- int i = 0;//初始化部分
- while (i < 5)//判断部分
- {
- printf("我是混子卷王\n");
- i++;//调整部分
- }
-
- return 0;
- }
此程序会输出五次混子卷王,注意while中的表达式:i<5才为真,当执行到第五次时,i++导致i的值为6,语句为假,退出循环。
!!!!!注意循环体中的i++,千万不要忘记,否则i的值一直不变化就会陷入到死循环中
如果我们想中途退出怎么办?就引入了break和continue
在循环执行的过程中,如果某些情况发生的时候,需要提前终止循环
break的作用是用于永久性的终止循环,执行循环之后的代码
只能在循环体内和switch语句中使用break
continue的作用是跳过本次循环中还没有执行的语句,进行下一次循环判断
!!continue语句并没有让整个循环终止且continue只能在循环语句中使用
下面来举个简单的例子:
混子卷王在进行真心话大冒险的时候,抽到了连续介绍自己5次的任务,但是趁大家不注意,卷王只说了3次就不说了。
- int main()
- {
- int i = 1;
- while (i <= 5)
- {
- printf("我是混子卷王\n");
- i++;
- if (i == 3)
- {
- break;
- }
- }
-
- return 0;
- }
执行的结果就是只执行力三次就跳出循环
而continue呢,这次我们改变一下任务,必须说这是你第几遍说的,而且第三次可以不用说,于是你的程序就是这样的:
- int main()
- {
- int i = 0;
- while (i < 5)
- {
- i++;
- if (i == 3)
- {
- continue;
- }
- printf("我是混子卷王,这是第%d遍\n",i);
-
- }
-
- return 0;
- }
执行结果就是这样的:
因为在i=3时,if判断条件生效,continue自动跳过下面的输出语句,进入下一次循环。
for循环应该是我们用的最多的循环了,它可以看作是while循环的集合体,while循环中的初始化,判断,调整三个部分都是分开的,而for循环可以把他们那整合到一起
- //for(初始化语句,判断语句,调整语句)
-
- //举例:打印0~4
-
- for(int i=0;i<5;i++)
- {
-
- printf("%d",i);//循环体语句
-
- }
我们可以清楚的看到for循环的具体结构,int i= 0就是初始化语句,然后进行对i值的判定,如果为真就执行下面的循环体语句,最后进行调整语句的i++;注意判断条件的边界问题,值得一提的是,在循环中,前置++和后置++对于结果没有影响。
如果需要多重循环,我们也可以使用嵌套for循环。
具体结构:
- do{
-
- 语句
-
- }while(表达式)
如果循环体内只有一条语句,可以不用加大括号。
while语句的流程图如下:
do-while语句的流程图如下:
通过流程图我们可以直观地看出二者之间的区别
while循环是先进行条件的判断,然后再开始语句的执行。
do-while循环是先执行语句,最后进行条件的判断
做一个猜数字的游戏,先让用户选择,根据用户的选择来进行游戏,自动生成数字,根据用户给出的猜想来提示用户“猜大了”或是“猜小了”,如果用户猜对了,那么会恭喜用户。
代码如下
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include<stdio.h>
-
- #include<stdlib.h>
-
- #include<time.h>
-
- //猜数字的函数,用来进行选择进行游戏之后的猜数活动
- void game()
-
- {
-
- int r = rand() % 100 + 1;//用来生成一个随机数
-
- int guess;
-
- while (1) {
-
- printf("请输入您的数字:");
-
- scanf("%d", &guess);
-
- if (r > guess) {
-
- printf("猜小了\n");
-
- }
-
- else if (r < guess)
-
- printf("猜大了\n");
-
- else
-
- {
- printf("猜对了!!!!!!!!\n");
-
- break;
- }
- }
- }
-
- int main() {
-
- printf("**********欢迎来到猜数字游戏*************\n");
-
- printf("***********请选择**************\n");
-
- printf("***********1.开始游戏************\n");
-
- printf("***********2.退出游戏************\n");
-
- int input;
-
- srand((unsigned int)time(NULL));
-
- do {
- printf("请输入:--->");
-
- scanf("%d", &input);
-
- switch (input) {//switch多重分支选择
-
- case 1:
-
- game();
-
- break;
-
- case 0:
-
- printf("退出游戏");
-
- break;
-
- default:
-
- printf("请重新输入");
-
- break;
-
- }
-
- } while (input);
-
- return 0;
-
- }
运行结果如下图:
在屏幕上输出九九乘法表
- #include<stdio.h>
-
-
-
- //乘法口诀表
-
- int main()
-
- {
-
- for (int i = 1; i < 10; i++)
-
- {
-
- for (int j = 1; j <= i; j++)
-
- {
-
- printf("%d * %d = %d ", i, j, i * j);
-
- }
-
- printf("\n");
-
- }
-
-
-
- return 0;
-
- }
运行结果如图:
打印1000年到2000年的所有闰年
- //打印闰年
- int main() {
- for (int i = 1000; i <= 2000; i++)
- {
- if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
- {
- printf("%d ", i);
- }
- }
-
-
- return 0;
- }
运行结果
相信看了我第一篇博客的朋友们都知道,混子卷王其实只是个混子,重新开始真的收获颇丰,希望大家能够在编程的时候及时弄清你们的问题,这篇笔记也是自己的感悟,有出错的地方欢迎大家及时指出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。