下面只是我的对于C语言的认识拙见,可以多多提出批评建议
计算机的诞生很大程度上就是为了来进行重复性的某些工作,就像工厂里面的流水线一样,都是在重复的循环做某一件事情,只要涉及到工作,就需要流程来控制,流程里面一个很重要的概念就是循环,循环的诞生就是解决实际工作中重复性的做一些工作。
但是如果只是靠循环重复性做某些事情是无法满足我们的需要的。
就像我们要设计了一个分拣出西红柿的流程,我们就需要用循环的把西红柿放到箱子里面。但是实际情况西红柿有大有小,有青有红的,有坏果,有好果等等情况。
我们绝对不可能直接就这样直接的把西红柿装箱了,因为分拣出来之后,不同品类的西红柿可以卖到不同的价格。所以我们就需要用这样一个判断西红柿品类的情况的机器,我了解的在里面有一个就是色选机,就可以把青色的果子和红色的果子给分开,这其实就是对西红柿的颜色给分类了。
那对于C语言作为一个编程语言也是遵循类似这样的流程,C语言对于这个分拣西红柿的例子提供了类似 色选器 的工具,就是本文会提到的 if switch 这种条件判断工具。
分支和跳转本质上其实就是一个 条件判断,然后选择项执行代码的一个总称。
条件判断非常有用,编程语言的灵活性很大程度上就是体现在流程控制,流程控制里面最重要的也就是 重复执行语句(循环)、满足条件执行语句(分支)。
在控制分支的时候,一般很少用到 类似 break; continue; goto的分支中断。本质在我的理解范围内,这些我是归类到循环中断里面的。 可以看看我的 C语言参悟-循环控制 内容。
条件判断在执行情况上体现的是要么执行,要么就不执行,也是最多 1 次,也有可能是 0 次。
这个基本的逻辑是我们解决实际问题的一个依据。
判断条件即是分支和跳转的灵魂。
判断的的条件和循环使用的条件是一样的。其实就是用的 1(非0) 和 0 表示的条件的是否满足。C语言就是用的就是 非0 表示 1,但是我一般还是用 的 1 来区分 0。只要一个式子是能计算出 0 或 非0 的式子就能充当判断条件的。
void 类型是不能充当判断条件的哈。
C语言的语句总是会计算出一个值的,之前是没有 布尔值,好像 C99 标准就是 有 _Bool 当 true 和 false 使用啦。
直接式
直接写值。
逻辑比较式
就是基于逻辑运算符 >、 <、 >= 、<=、!=、==、&&、|| 计算出来的值。
函数返回式
就是把函数的返回值当成一个标志来判断
计算式
就是使用了 逻辑运算、算术运算、函数返回运算等组合的计算,这个是最灵活的。
下面就以 if 的判断条件举例子
//直接式-真值
if(1)
if(2)
if(-13) //这个也是 真值哦!
if("") //这个也是 真值哦!
//直接式-假值
if(0)
if('\0')
if(NULL)
//逻辑比较式-真值
if(1 != 2)
if(0 == 0)
if(1 == 1) //别写成了 赋值号 =
if(1 > -12)
if('-' >= '+') // '-' 的ASCII值是 45; '+' 的ASCII值是 43
if('-' >= 44) //用的就是值比较的
if(45 >= 40 && 45 <= 50) //逻辑合并比较
if(1 > 0 || 1 < 0) //这个也是真值哦!C语言使用 || 判断时候是有逻辑短路性的,
//只有 || 多个条件中,重左到右只有有一个真值就执行啦,
// 但 && 是两个条件必须同时满足,就不具有逻辑短路
//逻辑比较式-假值
if(1 >= 2)
if('\0' > '+')
if(NULL == 1)
//函数式-真值
char m_ch;
//这个就是函数式子,这个执行了两个语句,第一个是获取字符,第二个是对读取的字符数比较
if(m_ch=getchar()) != EOF)
{
//从控制台读取数据
}
//这是一个函数原型:判断是否大写
int isCapitalized(char ch);
char ch = 'A';
if(isCapitalized(ch))
{
//这里就可以判断是否大写字母
// ch = ...语句之类
}
//计算式-真值
char m_ch = '-';
// 这个就是函数式子,这个执行了三个语句,
// 第一步是从控制台获取字符,
// 第二步是对读取的字符数比较是否是读正确没有
// 第三步是判断读取的字符是否是 '&'
if(m_ch=getchar()) != EOF && m_ch != '&')
{
//从控制台读取数据
}
//注意这个下面的写法和上面就是位置不对,
// 这个功能就完全不一样的哦,这个就是自己写代码的问题了
// 这里执行了三个语句,
// 第一步判断读取上一次的字符是否是 '&' :如果没初始化m_ch ,估计是有问题的,
// 第二步是从控制台获取字符,
// 第三步是对读取的字符数比较是否是读正确没有
if(m_ch != '&' && m_ch=getchar()) != EOF)
{
//.....
}
这个在C语言的 基础语法模式里就是:
这里的就是 选择 执行其中一条语句,要么执行 满足条件的语句 要么就执行 不满足条件的语句
if(条件)
{
满足条件的语句
}
else
{
不满足条件的语句
}
下面的多个 条件的也是, 其实就是 4个情况下 总是会选一个 语句执行 执行:四选一 执行记住!
if(条件1)
{
满足条件1的语句
}
else if(条件2)
{
不满足条件2的语句
}
else if(条件3)
{
不满足条件3的语句
}
else
{
不满足条件1、2、3的语句
}
但下面的这种,就是属于 条件并联 了, 就是多个 if else 组合嵌套。
if(条件1)
{
满足条件1的语句
}
if(条件2)
{
满足条件2的语句
}
这里的执行情况就是,可能是 满足条件1的语句 执行,可能 满足条件2的语句 执行,就是 0 - 2 次执行的机会
但是 满足条件1的语句 满足条件2的语句 只是在各自的条件满足后才会执行。
我理解的 串联是多个 if 条件嵌套的情况
if(条件1)
{
满足条件1的语句
if(条件2)
{
满足条件2的语句
}
}
这里的执行情况就是,在 条件1成立的情况下 满足条件1的语句 一定会执行,但是 满足条件2的语句 执行是否是由 条件2 决定,也就是说 满足条件2的语句 是同时满足 条件1 和 条件2 两个条件的。
但是 满足条件1的语句 满足条件2的语句 只是在各自的条件满足后才会执行。
这个也可以改写成 “并联” 的写法,如果能分开就分开 便于好理解,但有时候是不能分开的,就不要强行分开。
if(条件1)
{
满足条件1的语句
}
if(条件1 && 条件2)
{
满足条件2的语句
}
switch 他的中文名字叫开关,我觉得他的工作模式也很像物理生活里面开关的。我觉的这些设计这个语言的人真大佬。
基本的模式就是
switch(条件)
{
case '条件值1':
语句1;
break;
case '条件值2':
语句2;
break;
default
//条件值以外的语句
条件值以外的语句;
break;
}
这个的工作模式基本原理就是:
switch( 条件) : 会计算出一个值,这个值会在后面的 case '条件值’ 语句里面的 case 后面的值比较。
如果 case 这些语句存在于这个 switch( 条件) 计算出的值,那么就会跳转到 对应的 case ‘条件值’ 语句后面。不在就会跳到 default 后面的语句。
case 其实就根据 指示 跳转到哪些要执行的语句。switch 即是提供这个 指示 的东西。
break 其实就是控制这个是否接着执行的中断控制而已,就是下面 “单刀” “多刀” 开关形式。
对于像C下面的这种 switch 语句,表现的行为就是像下面的单刀选择,即是多选一开关图
switch(入口值)
{
case 'A':
//语句A-走A通道
语句A
break;
case 'B':
//语句B-走B通道
语句B
break;
case 'C':
//语句C-走C通道
语句C
break;
case 'D':
//语句D-走A通道
语句D
break;
case 'E':
//语句E-走E通道
语句E
break;
}
从入口进入,如果入口值是 ‘B’ 就是,switch就会跳转到case ‘B’ 位置,然后去执行语句B 的内容
语句B后面的 break 就是说,退出switch不去执行后面的语句了。也就是只执行完语句B,这个时候其实就是 多选一 的行为了。
case 'B':
//语句B-走B通道
语句B
break;
多刀开关其实和 单刀类似,只是 那个 break 发挥着神奇的作用,因为程序总是从上往下执行的。这个break 是一个退出条件。
那么去除一下 break 这个效果回事怎么样的呢?
switch(入口值)
{
case 'A':
//语句A-走A通道
语句A
break;
case 'B':
//语句B-走B通道
语句B
case 'C':
//语句C-走C通道
语句C
case 'D':
//语句D-走A通道
语句D
break;
case 'E':
//语句E-走E通道
语句E
break;
}
从入口进入,如果入口值是 ‘B’ 就是,switch就会跳转到case ‘B’ 位置,然后去执行语句B 的内容
因为语句B后面的没有break 语句,那程序就继续往下执行,一直执行到 break 或者最后的 switch 语句 ,因为default语句一般放在最后,也有说执行到default语句结束,但 default 语句不一定非要放在最后,也可以随便放的,因为一般放最后,刚好和 最后的 switch 语句位置重合了。
就像下面的开关一样是 多选 开关 的。