C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使⽤ if , switch 实现分⽀结构,使⽤语句 for 、 while 、 do while 实现循环结构。
if语句
if语句怎么使用呢?
if(表达式) //没有分号
语句 ;
//表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏
在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。
举个例子:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1) //这里的逻辑是奇数取模会余1
return 0;
}
printf("%d 是奇数\n", num)
这段代码会判断你输入的数是否为奇数。
那么这个时候就有人要问了,“ 主播主播这里只打印了奇数!要是偶数我该怎么办呀!”
问的好!
这里就需要if...else...语句了,它的用法是:
if (表达式1) //这里的if和esle都不需要分号
语句1;
else
语句2;
把上面那个例子改进一下:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
就能得到完整版的输一个数来判断奇偶辣!
默认在 if 和 else 语句中默认都只控制⼀条语句,要是有多种情况的话,那如果我们要if语句同时控制两条或多条语句,怎么办呢?那就要使⽤{ }将代码括起来, else 后也可以跟上⼤括号。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18) //if 后使⽤{} 控制多条语句这个块也叫:程序块,或者复合语句
{
printf("成年了\n");
printf("没有未成年游戏时长限制了!好耶!\n");
}
else //else 后使⽤{}控制多条语句这个块也叫:程序块,或者复合语句
{
printf("没有成年\n");
printf("还是好好学习罢\n");
}
return 0;
}
嵌套if:
要是我们分类情况是多种的,就要使用嵌套if语句。
在上面判断奇偶的例子中增加条件,
输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:⾮正数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num>0)
{
if(num % 2 == 1)
printf("%d 是奇数\n", num); //这里的if else 语句就是嵌套的
else
printf("%d 是偶数\n", num);
}
else
printf("⾮正数\n");
return 0;
}
悬空else:
其实这个问题可以概括成一个词:就近原则
来看例子:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
因为这里的a不等于1,所以不进嵌套的if语句,所以打印haha。
要是这么想那就错啦!
这里的else 和if(b == 2)是匹配在一起的,就近原则,
所以后面的语句都不会执行。它什么也不会打印。
关系操作符
C语⾔⽤于⽐较的表达式,称为“关系表达式”(relationalexpression),关系表达式通常返回 0 或 1 ,表⽰真假。⾥⾯使⽤的运算符就称 为“关系运算符”(relationaloperator),主要有下⾯6个。
> ⼤于运算符
< ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符
注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写 出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。
if (x = 3)
原意是x == 3 ,但是不⼩⼼写成 上⾯⽰例中那种, 对x赋值为3,所以返回值为 3 ,所以 if 判断总是为真。
为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边。
if(3 == x)
这样的话,把==写成=就会报错 。
另⼀个需要避免的错误是:多个关系运算符不宜连⽤。
i < j < k
因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的式子。
(i < j) < k
但是通常达不到想要的结果,上⾯式⼦中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤下⾯的写法。
i < j && j < k
条件操作符
条件操作符也叫三⽬操作符,需要接受三个操作数。
exp1 ? exp2 : exp3
逻辑是如果exp1为真,计算exp2,如果exp1为假,计算exp3。
⽤条件表达式实现找两个数中较⼤值。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = a>b ? a : b;
printf("%d\n", m);
return 0;
}
逻辑操作符:&&,||,!
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
! :逻辑取反运算符(改变单个表达式的真假)。
&& :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
if(a >= 3 && a <= 5)
//这个就是3<=a<=5的意思。
|| :逻辑或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
if(a == 12 || a==1 || a == 2)
//两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
来举一个判断闰年的例子:
//能被4整除并且不能被100整除是闰年
//能被400整除是闰年
int main()
{
int year = 0;
scanf("%d", &year);
if((year%4==0 && year%100!=0) || (year%400==0))
//上面这行代码的意思是 year能被4整除并且不能被100整除或者year能被400整除
printf("是闰年\n");
return 0;
}
短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。
&&中只要左边的式子判断为0(假)之后,就不再判断后面的式子了,
||中只要左边的式子判断为1(真)之后,就不再判断后面的式子了。
来看个小例子:
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c=3,d=4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
return 0;
}
a的值为零,是后置加加,&&判断第一个式子为假,所以不再判断后面的值,最后给a+1,输出。
代码运行后结果为:
a = 1
b = 2
c = 3
d = 4
有关其他分支语句(switch)和循环语句(while for 之类的)的介绍我会在后续发出来的!
非常感谢大家能看到这里!要是有表述不严谨或错误的地方请多多指正!(鞠躬)