在C语言中如何表示真假?
0表示假,非0表示真。
分支语句
1.悬空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;
}
这里并不会打印出haha,如果没有大括号else语句只会和相离最近的if进行匹配,但是这种代码风格又很容易让人误解
2.if 形式的比较
//代码1
if (condition) {
return x;
}
return y;
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
return 会跳出当前函数,所以代码1和代码2所表达的意思相同,但是代码1很容易让人造成误解
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
这里的5和num进行位置交换主要是为了防止写代码的过程中,将==(比较判断)写成=(赋值),代码4的情况下写成=是会发出报错的
循环语句
循环分为三种:
while
for
do while
1.while 循环
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断
getchar定义成int类型,是因为getchar的返回值是字符或者EOF(end of file),#define 定义EOF为整型的-1
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的
getchar在未获取到字符会在输入缓冲区等待,要让getchar获取到字符要在键盘上输入回车键(\n),但是输入缓冲区中也就有两个字符 ‘a’ , ’ \n ‘,因此while循环会putchar两次,光标会在下一行闪
此时输入缓冲区除了密码还有\n,scanf只是取走了其中的密码,还剩下一个\n
getchar看到输入缓冲区还有数据’\n’ 就直接与’Y’进行比较,并未让我们自行判断
所以,应当取走\n,让getchar等待输入
如果我们只是在getchar获取字符前加一个getchar来获取\n,如果密码中带空格,又不行了
scanf读取到空格就不会往后读取,而getchar又只获取了一个字符,输入缓冲区还是有数据,还是会自动判断
此时,就需要一个循环来读取,将缓冲区所有的数据读走,再进行判断
while 循环三部分代码块比较分散,在修改的过程中容易出现问题
2.for 循环
for循环中break和while循环相似,但是continue不一样
for循环是跳过后面的代码来到调整部分,而while是跳过后面的代码进入判断部分
2.1 for循环的变种
#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
这里i,j的初始化部分都省略了,j循环3次后 j = 3 ,由于失去初始化 j 始终是等于3,无法进入循环内部,所以最终是只打印3个hehe
判断部分k=0,=是赋值符号,将k赋值为假,循环0次
通过循环解决问题
求n的阶乘之和
1的阶乘加到3的阶乘,这里要注意ret 每次乘起来之后要及时的置为1,才不会出现累乘的效果
代码优化,将两层for循环变成1层
典型例题
折半查找法
两个关键点:
1、不能写成left<right
的形式 left <= right
某些情况下left和right将指向同一位置(最难找的情况)
2、 mid的初始化要放在循环中,每次进入while循环中mid的位置都会发生改变,放在循环外就没法修改了
多个字符从两端移动,向中间汇聚
1.strlen函数计算的是字符串长度,不包括斜杠0,但是right计算的是下标所以要减一,而sizeof计算的是字符个数,其中包括斜杠0
2.sleep函数要引用头文件windows
3.cls清空命令,system系统函数
用户登录情景,并且只能登录三次。
只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序
比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp,如果返回值是0,表示2个字符串相等
猜大小
基本框架如下:
关键是case 1当中的猜数字实现
但是rand函数生成的随机数每次都是固定的
在rand之前设置随机生成器srand函数
srand中也要传入1个随机值才能生成随机值(设置时间戳)时间戳的设置涉及time函数 time函数的返回值是long long 函数,而srand需要的是unsigned int 类型,所以需要强制类型转换
srand 函数头文件<stdlib.h> time函数的头文件<time.h>
srand 函数若设置在game函数中,可能会出现一样的情况,srand只需要在工程中设置一次即可
将rand%100可以将随机值控制在0~99之内.再加1就是100
猜数字的实现
goto语句
goto语句不能跨函数跳转,只能在当前函数体内跳转
关机程序
shutdown -s -t 60 设置电脑在60秒内关机
shutdown -a 取消关机
scanf %c 和%s的区别 %c是针对单个字符的 %s是字符串