Skip to content

Latest commit

 

History

History
190 lines (138 loc) · 3.36 KB

逻辑控制语句.md

File metadata and controls

190 lines (138 loc) · 3.36 KB

逻辑控制语句

C中的逻辑控制语句其实还是基本的那么几个,与python相比,多了switch语句和goto语句.作为pythoner这部分其实没啥可讲,这边只列出形式.

循环语句

for循环

for(exp1;exp2;exp3){
    代码块
}
  • exp1 一般是变量初始化,注意变量需要先声明,标准c语言不允许在exp1中直接声明变量,但其实很多编译器已经支持这种写法
  • exp2 用于判断是否停止循环,如果为为true则执行下面的代码块,否则不执行并且语句结束
  • exp3 如果exp2为true,则在执行完代码块后执行exp3,然后进入下一循环

while循环

while(exp){
    代码块
}
  • exp 判断其是否为真,如果是则循环结束,否则进入代码块执行,然后进入下一循环

do...while循环

do{
    代码块
}while(exp);
  • 先执行do中代码块
  • 在判断while中表达式,如果为真则循环结束,否则继续循环执行do中代码

break和continue

和python中一样,我们也可以用break和contiue来中断循环.规则也相同

例: 牛顿法求2开根

python版本

EPS = 0.00001
a = 2
X = a/2.0
lastX = 0
while(abs(X - lastX) > EPS ):
    lastX = X
    X = (lastX+float(a/lastX))/2
print(X)
1.4142135623746899

C版本:

#include <stdio.h>
#include <math.h>

const double N  = 2.0;

double sqrt_my(double a,double EPS){
    double x,last_x;
    x = a/2;
    do{
        last_x = x;
        x = (last_x + a/last_x)/2;
    }while(fabs(last_x - x) > EPS);
    return x;
}

int main(void){
    printf("根号2是%lf\n",sqrt_my(N,0.0001));
    return 0;
}

条件语句

if(exp1){
    代码块
}else if(exp2){
    代码块
}else{
    代码块
}

这个和python的差不多

分支语句

switch在python中被去掉了,主要也是因为它与if语句功能重复,不过swtich还是有用的,可以让代码看起来干净不少

switch(exp){
    case 常量表达式1:
        语句组1
        break;
    case 常量表达式2:
        语句组2
        break;
    case 常量表达式3:
        语句组3
        break;
    default:
        语句组4
}

case是可以贯通的,如果case下面没有break,则它会穿到下一个break之上的位置才执行结束.

goto

goto就厉害了,这个体现了c对底层的支持,它表示无条件跳转,用法是用label:标记要跳转的位置,然后goto label就可以了

这个语句是汇编语言的常用语句,用好了很牛,用烂很烂,建议不要滥用.

大致有这么两个使用场景:

多层循环跳出

多层循环嵌套代码会很难以维护,这时候可以考虑使用goto.

#include <stdio.h>
#include <math.h>

int complex_loop(void){
    for (int i=1;i<100;i++){
        for(int j=1;j<100;j++){
            if(i*j==200){
                goto outA;
            }
        }
    }
    goto outB;
 
    outA: return 1;
    outB: return 2;
}

int main(void){
    printf("结果是%d\n",complex_loop());
    return 0;
}
结果是1

统一处理并返回

这种尤其在异常处理时比较好用.

int func(){
    int res = 0;
    if(!){
        goto func_return_fail;
    }

    if(!func_step2()){
        goto func_return_fail;
    }

    func_return_normal:
        UnlockSomething();
        return res;

    func_return_fail:
        res = -1;
        UnlockSomething();
        return res;
}