C语言流程控制

  • 顺序结构:

    • 按书写顺序从上至下依次执行
  • 选择结构

    • 对给定的条件进行判断,再根据判断结果来决定执行代码
  • 循环结构

    • 在给定条件成立的情况下,反复执行某一段代码

选择结构if

- if选择结构格式

 -  第一种格式:
  if(条件表达式){
       条件成立执行的语句
 }
  其它语句
 
 第二种格式:
  if(条件表达式){
      条件成立执行的语句
  }else{
 条件不成立执行的语句
 }
 第三种格式:
  if(条件表达式1){
       条件满足执行的语句
  }else if(条件表达式2){
      条件满足执行的语句
  }else if(条件表达式3){
       条件满足执行的语句
  }else{
      条件不成立执行的语句
 }

if注意点

  • 1.if可以省略大括号
    • 如果if省略大括号, 那么只有紧随其后的那条语句受到控制

int age = 17;
if(age >= 18)
printf("开网卡\n");//条件不满足,不执行
printf("买饮料\n");

  • 2.{}可以单独出现, {}出现的时候代表是一个代码块
  • {
    int age = 88;
    printf("age = %i\n", age);
    }
    printf("age = %i\n", age);
  • 3.如果if省略了大括号, 那么不能再后面直接定义变量

    从表面上, num的作用域是从定义的那一行开始, 直到遇到}结束或者return为止
    但是从实际上而言, num只有if的条件满足才会执行, 所以两者冲突

int age = 18;
if(age >= 18)
int num = 666;
printf("开网卡\n");

  • 4.除了if以外elseif还有else也可以省略大括号
    省略大括号之后的特点和if省略之后一样
    只有紧随其后的语句受到控制
    也不可以直接定义变量

    int age = 41;
    if(age >= 40)
    printf("40\n");
    else if(age >= 30)
    printf("30\n");
    else
    printf("other\n");
    printf("40 2222\n");

    • 5.任何数值都有真假性

    if(0){
    printf("abc");
    }
    int age = 3;
    if(age = 18){
    printf("被执行了\n");
    }

    if(18 == age){ // 在企业开发中如果要判断是否相等, 建议把常量写在起那么, 把变量写在后面
    printf("被执行了\n");
    }

    double num = 3.14;
    // 在企业开发中一定不要使用==来判断两个小数是否相等
    // 因为小数可能出现精度问题
    // 如果在企业开发中要判断两个小数是否相等, 那么建议使用 >= <=
    if(3.14 == num){
    printf("是3.14\n");
    }

  • 6.如果if else省略大括号的时, else会自动匹配距离自己最近的那个if
    // 但是有一个前提条件, 就是这个if没有被其它的else匹配
    // 注意点: 编译器会把if else看做是一个整体

// if(0)
// if(1)
// printf("A\n");
// else // 和if(1)匹配
// printf("B\n");
// else // 和if(0)匹配, 因为if(1)已经被匹配过了
// if (1)
// printf("C\n");
// else // 和if(1)匹配
// printf("D\n");

一般企业开发中不会省略

// if(0)
// if(1)
// printf("A\n");
// else if(1) // 和if(1)匹配
// printf("B\n");
// else
// printf("c\n");
// else // 和if(0)匹配, 因为if(1)已经被匹配过了
// if (1)
// printf("D\n");
// else if(1) // 和if(1)匹配
// printf("F\n");
// else
// printf("G\n");

  • 7.if可以嵌套if

// if(1){
// if(0){
// printf("A\n");
// }else{
// printf("B\n");
// }
// }else{
// if(1){
// printf("C\n");
// }else{
// printf("D\n");
// }
// }

选择结构switch

  • switch选择结构的格式:
    switch(表达式){
    case 表达式1: // 相当于else if
    被表达式1控制的语句;
    break;
    case 表达式2: // 相当于else if
    被表达式2控制的语句;
    break;
    default: // 相当于else
    被default控制的语句;
    break;
    }

    • 执行流程:
      1.计算switch后面()中表达式的结果
      2.利用计算的结果从上至下的和switch后面{}中的case的表达式的值一次比较
      3.一旦发现switch表达式的值和case表达式的值相同, 就执行该case后面的语句
      4.一旦某个case被执行了, 其它的case就不会执行了
      5.如果所有case表达式的值和switch表达式的值都不相等, 那么就执行default后面的语句
int day = 3;
switch(day){
case 1:
    printf("星期一\n");
    break;
case 2:
    printf("星期二\n");
    break;
default:
    printf("Other\n");
    break;
}
  • 注意点
    • switch条件表达式的类型必须是整型, 或者可以被提升为整型的值(char、short)


  • default书写的位置, 可以随便写
    // 无论default是否是写在switch语句的最后, 都会最后执行
    // 如果default不是写在最后的, 那么break不能省略, 省略就会发生穿透问题
    // 记住一点: 永远把default写在最后
  • switch后面的()中只能表达式/变量/常量, 并且必须是整型或者能够被提升为整型的

// int num = 1;
// switch(num){ // 放一个变量
// switch(2){ // 放一个常量
// switch(1 + 1){ // 放一个表达式
// switch(1.1){ // 会报错, 小数不能提升为整型
// 不会报错, char类型可以提升为int类型
// char类型底层的本质存储的是ASCII码, 而ASCII码就是整型
// switch('a'){
// case 1:
// printf("A\n");
// break;
// case 2:
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }

  • switch的case后面只能放常量和表达式, 并且必须是整型或者能够被提升为整型的

// int num = 1;
// switch(2){
// case 1: //常量
//// case num: // 变量, 会报错
// printf("A\n");
// break;
// case 1 + 1: // 表达式
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }

  • switch的case后面的值不能重复

// int num = 1;
// switch(2){
// case 2:
// printf("A\n");
// break;
//// case 1: // 会报错
// case 1 + 1: // 会报错
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }

  • switch的case后面不能定义变量
    如果要在case后面定义变量, 必须在case后面加上{}

switch(1){
case 1:{
int num = 666; // 会报错
printf("A\n");
break;
}
case 2:
printf("B\n");
break;
default:
printf("Other\n");
}
return 0;
}

循环结构

  • C语言中提供了三大循环结构, 分别是while、dowhile和for

循环结构while

  • 格式:
    while ( 循环控制条件 ) {
    循环体中的语句;
    能够让循环结束的语句;
    ....
    }
  • 示例

int count = 0;
while (count < 3) { // 循环控制条件
printf("发射子弹~哔哔哔哔\n"); // 需要反复执行的语句
count++; // 能够让循环结束的语句
}

whlie循环注意点
  • 任何数值都有真假性

int count = 0;
while (count < 3) { // 循环控制条件
printf("发射子弹~哔哔哔哔\n"); // 需要反复执行的语句
count++; // 能够让循环结束的语句
}

  • 当while后面只有一条语句时,while后面的大括号可以省略


  • 如果while省略了大括号, 那么后面不能定义变量

int main(){
while (1) // 死循环
int num = 10; // 报错
// 没有能够让循环结束的语句
}

  • while循环和if一样, 可以嵌套其它合法代码
    • while(条件表达式){
      被控制的语句;
      }
      特点: 会先判断条件是否满足, 满足就执行{}中的代码

    • do{
      被控制的语句;
      }while(条件表达式);
      特点: 不会像判断条件是否满足, 会先执行一次{}中的代码, 然后再判断条件

 while和dowhile的区别:
 while会先判断条件再执行循环体
 dowhile会先执行循环体再判断条件
while(0){
    printf("被控制的语句\n");
}

do{
    printf("被控制的语句\n");
}while (0);

// 在大部分的情况下while和dowhile是可以互换的
// 在企业开发中如果能够互换, 一般我们会使用while

循环结构for

  • 格式

for(初始化表达式;循环条件表达式;循环后的操作表达式) {
循环体中的语句;
}

  • 实例

for(int i = 0; i < 10; i++){
printf("发射子弹~哔哔哔哔\n");
}

  • for循环执行流程
    +首先执行"初始化表达式",而且在整个循环过程中,只会执行一次初始化表达式

    • 接着判断"循环条件表达式"是否为真,为真执行循环体中的语句
    • 循环体执行完毕后,接下来会执行"循环后的操作表达式",然后再次判断条件是否为真,为真继续执行循环体,为假跳出循环
    • 重复上述过程,直到条件不成立就结束for循环
  • for循环注意点:

    • 和while一模一样
    • 最简单的死循环for(;;);
  • for和while应用场景

    • while能做的for都能做, 所以企业开发中能用for就用for, 因为for更为灵活
    • 而且对比while来说for更节约内存空间

四大跳转

  • C语言中提供了四大跳转语句, 分别是return、break、continue、goto

  • break:

    • 立即跳出switch语句或循环
    • 应用场景:
      • switch
      • 循环结构
  • 注意点

    • break离开应用范围,存在是没有意义的
  • continue

    • 结束本轮循环,进入下一轮循环
    • 应用场景:
      • 循环结构
  • continue注意点:

    • continue离开应用范围,存在是没有意义的
  • goto

    • 这是一个不太值得探讨的话题,goto 会破坏结构化程序设计流程,它将使程序层次不清,且不易读,所以慎用
    • goto 语句,仅能在本函数内实现跳转,不能实现跨函数跳转(短跳转)。但是他在跳出多重循环的时候效率还是蛮高的
  • return

    • 结束当前函数,将结果返回给调用者
    • 不着急, 放一放,学到函数我们再回头来看它

循环嵌套

  • 循环结构的循环体中存在其他的循环结构,我们称之为循环嵌套
    • 注意: 一般循环嵌套不超过三层
    • 外循环执行的次数 * 内循环执行的次数就是内循环总共执行的次数
  • 循环优化
    • 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数

for (col=0; col<5; col++ ) {
// 高效率:长循环在最内层
for (row=0; row<100; row++) {
sum = sum + a[row][col];
}
}

for(int i = 0; i< 5; i++) {
for(int j = i; j < 5; j++) {
printf("*");
}
printf("\n");
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容