【嵌入式修炼之路】- C语言第三课之程序结构

学益得线上课堂
从基础学习嵌入式
玩转智能硬件、斩获高薪offer

if语句

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语句是一种多分支选择语句,在实际应用中,要在多种情况中选择一种情况,执行某一部分语句。形式如下:

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循环

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循环一般用于循环次数确定的场景,用法如下:

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++)
    {
        //循环体
    }
}

第一种效率要低于第二种效率。

更多视频、文章、嵌入式学习资源,微信关注 【学益得智能硬件】

【嵌入式修炼之路】- C语言第三课之程序结构_第1张图片

你可能感兴趣的:(C语言)