学益得线上课堂
从基础学习嵌入式
玩转智能硬件、斩获高薪offer
if 语句是C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写 if 语句。所以本节课程就以 “与零值比较” 开始课程。
与零值比较
常见的写法是这样的
#include
int main()
{
int a = 0;
if (a == 0) //变量写在左边,常量写在右边
{
printf("helloworld\n");
}
return 0;
}
一名合格的程序猿是这样写的
#include
int main()
{
int a = 0;
if (0 == a) //常量写在左边,变量写在右边
{
printf("helloworld\n");
}
return 0;
}
为什么会这样写?我们在写代码的时候,会不自觉的把 == 写成 =,含义完全变掉了,从逻辑运算符变成了赋值运算符。
if (a == 0); //判断变量 a 是不是 0。
if (a = 0); //变量 a 赋值为 0。
如果不小心写成了第二种,含义变了,但是编译的时候却没有问题。运行的时候结果大不一样,而且很难定位。
if (0 == a);
if (0 = a); //编译报错
如果换成第二种写法,就算写代码的时候不小心丢掉了一个 = 也不用担心,因为常量不能作为左值使用,编译直接报错。
if 语句的常见用法
if (condition1) //如果 condition1 条件成立,则执行下面的语句1
{
//语句1
}
if (condition1) //如果 condition1 条件成立,则执行语句1,否则执行语句2
{
//语句1
}
else
{
//语句2
}
if (condition1) //如果条件1成立,执行语句1,结束;如果不成立,判断条件2
{
//语句1
}
else if (condition2) //如果条件2成立,执行语句2,结束;如果不成立,执行语句3
{
//语句2
}
else
{
//语句3
}
简易计算器
#include
int main()
{
int num1, num2;
char opt;
scanf("%d%c%d", &num1, &opt, &num2);
if ('+' == opt)
{
printf("%d\n", num1 + num2);
}
else if ('-' == opt)
{
printf("%d\n", num1 - num2);
}
else if ('*' == opt)
{
printf("%d\n", num1 * num2);
}
else if ('/' == opt)
{
printf("%d\n", num1 / num2);
}
else
{
printf("error\n");
}
return 0;
}
switch语句是一种多分支选择语句,在实际应用中,要在多种情况中选择一种情况,执行某一部分语句。形式如下:
switch(condition)
{
case 常量表达式1: //如果condition能够匹配常量表达式1,则执行语句1,结束
//语句1
break; //如果不加 break 执行完语句1,程序会继续执行下一行代码
case 常量表达式2:
//语句2
break;
case 常量表达式3:
//语句3
break;
....
default:
//语句4
}
简易计算器
#include
int main()
{
int num1, num2;
char opt;
scanf("%d%c%d", &num1, &opt, &num2);
switch(opt)
{
case '+':
printf("%d\n", num1 + num2);
break;
case '-':
printf("%d\n", num1 - num2);
break;
case '*':
printf("%d\n", num1 * num2);
break;
default:
printf("error\n");
}
return 0;
}
while循环是C语言常用循环语句之一。如果循环的次数不确定,可以使用while循环。用法如下:
while (condition) //只要条件成立, 就执行循环体
{
//循环体
}
示例
写一道很经典的笔试题:某地房价200万,每年涨10%;某程序猿年薪40万,不涨工资。假设他不吃不喝不消费,问几年能买得起房?
很明显,这个循环不知道循环次数,需要使用while循环。
#include
int main()
{
int sum = 0; //存款
int year = 0; //经过了多少年
double price = 200; //房价
while (sum < price) //循环条件是 存款 < 房价
{
year++; //加上一年
sum += 40; //存款每年增加40万
price += 0.1 * price; //计算房价
}
printf("第 %d 年买得起房!\n", year); //满足条件,跳出循环
return 0;
}
do while
do while 的用法如下:
do
{
//循环体
} while (condition);
while的特点是 先判断、再执行,do while的特点是先执行、再判断。
for循环一般用于循环次数确定的场景,用法如下:
for (表达式1; 表达式2; 表达式3)
{
//循环体
}
执行顺序
表达式1 -->> 表达式2 -->> 循环体 -->> 表达式3 -->> 表达式2 -->> 循环体 -->> 表达式3 -->> 表达式2 -->> 循环体 …
注意:表达式1只会执行一遍,作为for循环的条件初始化使用。如果不满足条件2,则退出循环。
示例
上节课留了一个问题
int i = 0;
for (i = 0, printf("i = %d\n", i); i < 5, printf("i = %d\n", i); i++, printf("i = %d\n", i))
{
printf("helloworld!\n");
}
结果是一个死循环!
for循环的表达式2是一个逗号表达式,逗号表达式的执行顺序:先执行 i < 5,不管成立或者不成立,都不作为 for 循环表达式2的结果。表达式2的结果应该是 printf 函数的返回值。 i < 5 确实执行了,只不过结果没有起作用,printf 函数才会对 for 循环起到限制作用,而 printf 返回非 0,于是 for 循环一直成立,无法退出。
continue
结束本次循环,继续下一次循环。
int i = 0;
for (i = 0; i < 5; i++)
{
if (2 == i)
{
continue; //for 循环遇到continue,下面的代码(循环内)不会执行,跳到语句 i++,继续下一次循环
}
printf("helloworld\n");
}
break
结束本层循环。
int i;
for (i = 0; i < 5; i++)
{
if (2 == i)
{
break; //for 循环遇到break,当前循环结束,剩下的 2 次循环也结束
}
printf("helloworld!\n");
}
注意:如果是循环嵌套,只影响当前的 for 循环,不影响其他嵌套的循环。
循环效率
注意减少跨切循环层的次数,比如同样是循环2000次:
int i, j;
for (i = 0; i < 1000; i++) //跨循环层 1000 次。
{
for (j = 0; j < 2; j++)
{
//循环体
}
}
int i, j;
for (i = 0; i < 2; i++) //跨循环层 2 次。
{
for (j = 0; j < 1000; j++)
{
//循环体
}
}
第一种效率要低于第二种效率。
更多视频、文章、嵌入式学习资源,微信关注 【学益得智能硬件】。