目录
1、if 语句
判断是否为奇数?
练判断输入数字是0,还是正数或负数?
悬空else问题
2、关系操作符
3、逻辑操作符
判断是否是闰年?
短路求值
4、switch语句
输入1~7的数字,打印对应的星期几。
输入1~5,输出"工作日";输入6~7,输出"休息日"
5、while循环
while循环中的continue和break:
6、for循环
计算1~100之间3的倍数的数字之和
for循环中的continue和break:
7、do-while循环
输入一个正整数,计算这个正数是几位数?
do-while循环中的break和continue:
8、循环的嵌套
找出100~200之间的素数,并打印。
9、goto语句
//if语句的三种语法:
if(expression) //只有一条语句的if语句
sentence;
if(expression) //if...else...语句
sentence 1;
else
sentence 2;
if(expression 1) //if...else if...语句
sentence 1;
else if (expression 2)
sentence 2;
......
else if(expression m)
sentence m;
else
sentence n;
当表达式结果为真则语句执行,表达式为假则语句不执行(其中0为假,非0为真)
#include
int main()
{
int num = 0;
scanf_s("%d", &num);
if (num % 2 == 1)
printf("%d是奇数\n", num);
printf("你猜对啦\n");
return 0;
}
这时就会发现不管输入的数字是多少“你答对啦”总是会出现,这是因为默认情况下if语句和else语句都只能控制一个语句,可以通过添加{}来解决if和else后多语句问题,具体代码如下
#include
int main()
{
int num = 0;
scanf_s("%d", &num);
if (num % 2 == 1)
{
printf("%d是奇数\n", num);
printf("你猜对啦\n");
}
return 0;
}
同样的对于else来说也可以在其后增加{}来达到同样的效果
#include
int main()
{
int num = 0;
scanf_s("%d", &num);
if (num % 2 == 1)
{
printf("%d是奇数\n", num);
printf("你猜对啦\n");
}
else
{
printf("你猜错啦\n");
}
return 0;
}
#include
int main()
{
int num = 0;
scanf_s("%d", &num);
if (num == 0)
{
printf("输入的数字是0\n");
}
else if (num > 0)
{
printf("输入的数字是正数");
}
else
{
printf("输入的数字是负数");
}
return 0;
}
//当if个数大于else个数时就会出现悬空else问题,具体情况如下:
//代码运行结果为空
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
结果显示为空,这是因为else默认与最近的if匹配
实际情况下的代码应该是这样的:
//代码运行结果为空
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1) //a != 1,表达式结果为假内部if...else...语句不执行
{
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
若想要else与第一个if匹配只需要这样改:
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
综上所述,if语句中对于{}的运用是十分重要的,可以增强代码的可读性以及减少问题的发生。
C语言中运用比较的表达式,称为"关系表达式",里面使用的运算符就称为"关系运算符",主要有下面6个。
> 大于运算符
< 小于运算符
>= 大于等于运算符
<= 小于等于运算符
== 相等运算符
!= 不等运算符
注意!!! 相等运算符==与=是两个不一样的运算符,前者表示判断而后者表示赋值
可以通过将变量写在等号右边的位置来避免自己出错的可能
if(3 == a) ...
同时:多个关系运算方法不可以连用。
a < b < c
应该采用这样的写法:
a < b && b < c
!:逻辑取反运算符
const flag //定义变量flag
if(!flag) //当flag为假时执行语句printf("hehe\n")
{
printf("hehe\n");
}
&& :与运算符,同真则真
|| :或运算符,同假则假
//方法一
#include
int main()
{
int year = 0;
scanf_s("%d",&year);
if(year %4 == 0 && year % 100 != 0)
printf("是闰年\n");
else if(year % 400 == 0)
printf("是闰年\n");
return 0;
}
//方法二
#include
int main()
{
int year = 0;
scanf_s("%d",&year);
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
prinft("是闰年\n");
return 0;
}
除了if语句之外,C语言还提供了switch语句来实现分支结构。相比于多重的if...else if语句,它有更易用、可读性更好的优势。具体格式如下:
switch(expression) //expression必须式整型表达式
{
case value1: //value的值必须为整型常量表达式
statement;
break;
case value2: //case和value之间必须有空格,且value之后为冒号:而非;
statement;
break; //通过在case语句末尾加上break来实现跳出switch循环的目的
default: //当为找到可以匹配的case时,就会执行default语句,一般情况下default位于
statement; //switch语句末尾
break;
}
switch语句中break的运用:
break语句在switch语句中时十分重要的,能帮助switch实现真正的分支效果,当然break也不是每个case语句都得有,需要根据实际情况判断。下面通过两个练习来更好的根据实际情况判断break的使用时机。
具体代码如下:
#include
int main()
{
int day = 0;
scanf("%d",&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("不存在\n");
break;
}
return 0;
}
#include
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
C语言提供了3种循环语句,while循环就是其中一种。
while(expression) //判断表达式expression为真时进行循环否则跳出循环
{
语句;
}
//break的运用
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
break; //当i == 5 时循环全部结束,这时候输出结果为1 2 3 4
}
printf("%d\n", i);
i++;
}
return 0;
}
//continue的运用
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue; //当i == 5时重新返回while(expression)处进行判断
} // 因为当i == 5时跳过了i++,所以i一直为5,死循环
printf("%d\n", i);
i++;
}
return 0;
}
for(初始化;判断;调整)
{
语句
}
#include
int main()
{
int i = 0;
int sum = 0;
int count =0;
for (i = 1; i <= 100; i++)
{
if (i % 3 == 0)
{
sum += i;
count++;
}
}
printf("%d\n", sum); //得到结果
printf("总共有:%d个\n", count); //判断一共有多少个满足条件的数
return 0;
}
//更简单的写法
#include
int main()
{
int i = 0;
int sum = 0;
int count =0;
for(i = 3;i <= 100 ;i+=3)
{
sum += i;
count++;
}
printf("%d\n",sum);
printf("总共有:%d个\n",count);
return 0;
}
//break的运用
#include
int main()
{
int i = 1;
for(i = 1;i<=10;i++)
{
if(i == 5)
break; //和while的break一样都是结束整个循环
printf("%d",i);
}
return 0;
}
//结果为1 2 3 4
//continue的运用
#include
int main()
{
int i = 1;
for(i = 1;i<=10;i++)
{
if(i == 5)
continue; //相比于while中的continue直接跳到while(expression)处进行
printf("%d",i); //判断,for循环中的continue是跳转到循环的调整部分即i++处
}
return 0;
}
//结果为1 2 3 4 6 7 8 9 10
不同于while循环先判断再执行语句的形式,do-while循环时按照先执行后判断的形式进行的,一班do-while循环使用在循环体至少执行一次的场景下,所以较少一些。
do
{
语句;
}while(expression); //这里的while需要加;
#include
int main()
{
int n = 0;
scanf("%d",&n);
int cut = 0;
do
{
cnt++;
n=n/10;
}while(n);
printf("%d\n",cnt);
return 0;
}
do-while循环中的continue与break和while循环的作用几乎一模一样。
//break的运用
#include
int main()
{
int i = 1;
do
{
if(i == 5)
break;
printf("%d",i);
i++;
}while(i<=10);
return 0;
}
//continue的运用
#include
int main()
{
int i = 1;
do
{
if(i == 5)
countinue;
printf("%d",i);
i++;
}while(i<=10);
return 0;
}
已经学习过了while循环、for循环、do while循环,而这三种循环往往只有嵌套在一起才能更好的解决问题,我们称之为循环嵌套。
注:素数又称质数,只能被1和其本身整除的数字。
#include
int main()
{
int i = 0;
for(i = 100;i<=200;i++) //循环产生100~200的数字
{
int j = 0; //初始化j,使得每次大循环结束后j的值都会被初始化
int flag = 1; //每次在内置for循环结束后flag就会被初始化为1,即开始时假设i为素数
for(j = 2;j
C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一函数内跳转到设置好的标号处。比如:
#include
int main()
{
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
//结果为:
//hehe
//跳过了haha的打印
goto语句如果使用不当,就会导致在函数内部随意乱跳,所以一般不建议使用,但是当想要从多层循环中快速跳出的话,goto语句会显得很方便。
for(...)
{
for(...)
{
for(...)
{
if(disaster) //例子中的意思时当运行结果有问题时跳出循环到外面的error
goto error;
}
}
}
error:
//.....
相比于使用多个break时在循环中一层一层的跳出,直接使用goto语句显得很方便。