铺垫一下:C语言是一门结构化的程序设计语言,支持三种结构:顺序结构、选择结构、循环结构。顺序结构就是直接一条路走到黑这个意思,选择结构就是一件事情接下去可能会有其他的选项,循环结构就是一件事情去循环的做。
于是为了实现这种选择结构,C语言就提供了if和switch语句,也提供了for、while和do.while循环来实现循环结构
正文:
- if语句基本结构:if(表达式)
语句
表达式的结果如果为真,语句就会被执行,为假,就不会被执行(C语言中0表示假,非0为真)。
例子:
if后面表达式中如果输入一个奇数,结果为1非0,就可以执行下面的语句,如果输入偶数,结果为0,就不会执行。
//输入一个数,判断是否为奇数:
int main()
{
int num = 0;
//输入
scanf("%d", &num);
//判断
if (num % 2)
printf("%d是奇数\n", num);
return 0;
}
注意事项:if后面默认跟一条语句,如果需要跟多条语句,需要把这些语句都用{ }给包括起来。而且,可以使用{ }来实现if语句的嵌套使用。
//输入一个数判断是什么数
int main()
{
int n = 0;
scanf("%d", &n);
//情况1:可能是0
if (n == 0)
{
printf("输入的值是0\n");
}
//情况2:非0
else
{
if (n > 0)//正
{
printf("输入的值是正数\n");
}
else
printf("输入的值是负数\n");//负
}
return 0;
}
如果简化一下,就变成如下:
int main()
{
int n = 0;
scanf("%d", &n);
//情况1:可能是0
if (n == 0)
{
printf("输入的值是0\n");
}
//情况2:非0
else if (n > 0)//正
{
printf("输入的值是正数\n");
}
else printf("输入的值是负数\n");//负
return 0;
}
注意事项:判断0的那个表达式,用的是==而不是=。因为判断是==,如果是=,那就是赋值,赋值为0的话,是不会走这条路的。
接下来细说悬空else问题:如果有多条if else语句,记住规则:else与离它最近的if相匹配:
例:
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,不为1,走下面else打印haha,但是下面的else是和上面的if(b==2)匹配的,也就是说它判断a不等于1之后后面没有else了,就结束了。其实这样子对齐只是为了混淆视听,现实中这样的代码是不合格的,我觉得很坏就对了。最好是这样写:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
同时这样也可以说明if和else合起来是一条语句,叫做ifelse语句,希望大家可以清楚。
如果想要打印出一开始想要的那种效果,可以:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
printf("haha\n");
return 0;
}
2.关系操作符:C语言中,大于等于写作>=,小于等于写作<=,不等于写作!=。判断两个数或者两个对象之间的关系叫做关系表达式。关系表达式通常计算的结果返回的是0和1,表示真假,通常用于if或者while语句当中。再次强调 ==才是判断,=为赋值。
int main()
{
int x = 0;
if (x == 3)
{
printf("hehe\n");
}
return 0;
}
结果是不打印的,但是如果将==变成=:
int main()
{
int x = 0;
if (x = 3)
{
printf("hehe\n");
}
return 0;
}
因为变成了赋值表达式,x的值是3,非0,就会打印。
接下来关于要连续进行判断比如1<a<3这种形式的。
在C语言中,这种写法在语法层面是不会报错的,但是其逻辑是有问题的。例如:
int main()
{
int a = 3;
int b = 20;
int c = 5;
if (a < b < c)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
结果是:
表达式执行的其实是先去判断a<b,结果为真,返回1,所以a<b的值就是1,然后1再去和c比较,结果也为真,所以打印hehe。如果想要达到预期效果,正确的写法应该是a<b&&b<c。
3.条件操作符:也称三目操作符
基本形式:表达式1?表达式2:表达式3(由问号和冒号隔开的操作符)
计算逻辑:如果表达式1为真,就计算表达式2,如果表达式1为假,就计算表达式3,最后的结果是整个表达式的结果。
例:
int main()
{
int a = 0, b = 0;
scanf("%d", &a);
b = (a > 4 ? 3 : 6);
printf("%d", b);
return 0;
}
另外,关于三目操作符的组合,是从右到左计算的
例:
4.逻辑操作符:&&,||,!,分别表示并且、或者和逻辑取反(改变单个表达式的真假),主要用于构建更复杂的表达式
逻辑取反:
int main()
{
int flag = 0;
if (!flag)
printf("hehe\n");
return 0;
}
逻辑与运算符:
两个为真才是真的真,两个只要其中之一为假就是假。
逻辑或运算符:
两个为假才是真的假,两个只要其中之一为真就是真。
例子:判断是否为闰年
//1.能被400整除
//2.能被4整除但是不能被100整除
int main()
{
int year = 0;
//输入;
scanf("%d", &year);
//判断:
if (year % 4 == 0)
{
if (year % 100 != 0)
{
printf("闰年\n");
}
}
if (year % 400 == 0)
{
printf("闰年\n");
}
return 0;
}
int main()
{
int year = 0;
scanf("%d", &year);
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
printf("闰年\n");
return 0;
}
短路:C语言中逻辑运算符还有一个特点,它总是先对左侧的表达式求值,然后再对右边的表达式求值,这个顺序是保证的,如果左边的表达式满足逻辑运算符的条件时,就不再对右边进行求值,这种情况称为短路。
先拿&&来说,if (a>=3&&a<=5) ,当数入4时,左边为真,它还要去判断右边。如果输入1时,左边为假,那么右边为假或者真都不重要了,就不会计算右边,提前终止。
对于||,if (a>=3||a<=5) ,如果输入4时,已经满足条件了,就不会再去计算右边。
例:
int main()
{
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;//赋值表达式,优先级较低,所以先算右边再赋值给i
//i = a++ || ++b || d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
printf("i=%d\n", i);
return 0;
}
a=0,a++先赋值后++,等号右边第一个的结果为0,于是后面的b也不会计算了,所以a&&b整体为0,于是后面的d也不会计算了,所以整体为0,i=0。
同理,如果将a改为1,整体变为真,i=1。
int main()
{
int i = 0, a = 1, b = 2, c = 3, d = 4;
//i = a++ && ++b && d++;//赋值表达式,优先级较低,所以先算右边再赋值给i
i = a++ || ++b || d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
printf("i=%d\n", i);
return 0;
}
先算a++,先赋值为0,然后++,于是b也要计算,++b结果为2,所以a++||++b整体为1,于是后面就不用计算了,d不变,整体为真,i=1。
5.switch语句:
括号内部为表达式,根据表达式的情况执行相应的case分支,如果找不到对应的值,就执行default分支。另外括号的表达式为整型表达式,并且case后面衔接着的是整型常量表达式。
int main()
{
int n = 0;//打印数字被3整除得到余数的结果
scanf("%d", &n);
switch(n % 3)
{
case 0:
printf("整除了,余数是0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
case 3:
printf("余数是3\n");
}
return 0;
}
这个代码并不完美,运行结果有误。
原因是case是一个入口,但是后面得衔接停下来的指令,如果没有的话它会一直走下去,知道switch语句结束。如果想停下来,就加入break。
int main()
{
int n = 0;//打印数字被3整除得到余数的结果
scanf("%d", &n);
switch(n % 3)
{
case 0:
printf("整除了,余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
case 3:
printf("余数是3\n");
break;
}
return 0;
}
关于default,如果所有的case都不匹配就会匹配上default
严格来说default语句没有位置要求,但是写代码时都是先写出可能的情况最后再写default。
以上就是关于分支语句的内容,over。