C 语言基础之C 语言三大语句注意事项

目录
  • 1、分支语句
  • 2、if语句
  • 3、switch语句
    • 3.1语句结构
  • 4、循环语句
    • 4.1 while循环(do while类似)
    • 4.2 do while循环
    • 4.3 for循环
  • 5、goto语句

在今天的内容介绍之前我们要知道:C语言中,由一个分号( ; )隔开的就是一条语句。

很好理解,如:

int a=3;//语句1

printf("请大家多多指教!");//语句2

;//语句3----空语句

今天讲解的内容,则是自己对于这三种语句一些细节的介绍。(并不是具体讲解这些语句)

分支语句:if,switch

循环语句:while,for,do while

goto语句

补充小知识(后面如果遇见,可在此了解)

  • C语言中:0 表示假--------非0 表示真,如:1,2,-1
  • EOF: EOF是一个计算机术语,为End Of File的缩写(文件结束标志),其值为-1。通常在文本的最后存在此字符表示资料结束。
  • getchar():(来源于MSDN,大家可以自己翻译一下哦 \(^ ^)/ )
  1. Read a character from a stream (getc, getwc), or get a character from stdin (getchar, getwchar).
  2. Return Value
  3. Each of these functions returns the character read. To indicate an read error or end-of-file condition, getc and getchar return EOF. For getc and getchar, use ferror or feof to check for an error or for end of file.(个人理解:如果正确读取,返回的是对应字符的ASCII码值,如果读取失败/结束/错误,返回的是EOF)
  • getchar返回类型为int。(因为他返回的可能是ASCII码值,或者是EOF(-1))
  • scanf()在读取字符时会跳过空格、制表符和换行符(这里不作详细介绍啦,后面会有专门章节介绍)
  • system()——执行系统命令的一个函数——来自头文件<stdlib.h>
  • shutdown -s——关机命令、shutdown -s -t time——在time秒后自动关机、shutdown -a——取消关机
  • 如果要让程序实行60s内关机:system("shutdown -s -t 60");
  • strcmp:比较字符串大小的函数。如果要比较字符串A和B的大小,代码如下:strcmp(A,B);
  • 如果返回值=0,则两个字符串相等;如果返回值>0,则A字符串长度大于B;如果返回值<0,则A字符串长度小于B

1、分支语句

分支语句其实就是一种选择结构。对于要先做判断再选择的问题就要使用分支语句。

比如:如果你喜欢我的文章,可以给我点赞收藏;要是不喜欢的话,可以给我一些改进的建议。甚至你 以有其他很多的选择,这都是分支语句的一部分。

C语言中使用选择结构,就要用到:ifswitch

2、if语句

if else 后面如果有多条语句,要加大括号{ }

代码如下:【期待如果age<=18,输出未成年;age>18,输出成年了 可以恋爱啦!】

int age=24;
if(a>18)
 printf("未成年");
else
 printf("成年了");
 printf("可以恋爱啦!")

这段代码结果:成年了 可以恋爱啦!

但是如果让age=8的话,输出结果是:未成年 可以恋爱啦! 这并不符合我们的需求

所以需要将else后面这两个语句用{ }括起来。

悬空else: else 与离他最近的 未匹配的if 匹配

代码如下:(大家可以思考一下答案是什么)

int a=0;
int b=2;
if(a==1)
    if(b==2)
        printf("hehe\n");
else
    printf("haha\n");

大家想到了吗,其实这道题根本不会打印结果。

这道题不仅要我们知道,else与离他最近的if匹配;还要我们注意代码的书写风格是很重要的

这里推荐一本有关代码风格的书《高质量的C-C++编程》,大家可以找到电子版的进行学习。

3、switch语句

switch语句常常用于多分支情况

对于如:

输入1,输出周一

输入2,输出周二

输入6,输出周六

输入7,输出周日

如果用if…else if…else if…else的形式则显得复杂,这时用switch是一个更好的选择

3.1语句结构

switch(整形表达式)
{
    case 整形常量表达式:
        语句;
}

注意:
switch后面是整形表达式(比如int型,char型)【可以用字符,因为字符其实是整型的一种,底层存储的是字符对应的ASCII值】

case后面是整形常量表达式(比如1,1+2)

但是如果是下面的代码,可以对应数字输出星期几吗?大家可以思考一下

int day=0;
scanf("%d",&day);
switch(day)
{
    case 1:
        printf("Mon\n");
    case 2:
        printf("Tue\n");
    case 3:
        printf("Wed\n");
    case 4:
        printf("Thus\n");
    case 5:
        printf("Fri\n");
    case 6:
        printf("Sat\n");
    case 7:
        printf("Sun\n");
}

答案是,如果我输入1,则会输出所有的星期。因为我输入的值是一个入口,如果我输入2,则从case2进入, 但是好像没有出口去使语句停止下来,故会一直往后输出,直到switch结束。

故这个时候,搭配break,才能使switch实现真正的分支。

但是break并不是一定要加的,根据需求添加,如以下代码(根据数字打印工作日和休息日)

int day=0;
scanf("%d",&day);
switch(day)
{
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日\n");
        break;
    case 6:
    case 7:
        printf("休息日\n");
        break;//可以省略,不过建议加上
    //default:
      //  printf("输入错误");
        //break;
}

再提一下default。如果不加default,如上面的代码。如果输出不是1到7的数字,则不会打印任何东西就结 束。但是你可以加一个default,如果输入的不符合上面要求,则显示输入错误,可以提醒一下自己。(根据 需求)

至于default的位置,可以不在最后面,只要其他的需求符合题意,放在其他位置也行。

最后可以通过一段代码检验大家是否好的理解了switch

int n=1;
int m=2;
switch(n)
{
    case 1:m++;
    case 2:n++;
    case 3:
        switch(n)
        {//switch允许嵌套使用
            case 1:
                n++;
            case 2:
                m++;
                n++;
                break;
        }
    case 4:
        m++;
        break;
    default:
        break;
}
printf("m=%d,n=%d\n",m,n);

如果你的答案是 5,3,那表示你理解了。如果不是的话,可以对照上面关于switch再好好琢磨一下哦。

4、循环语句

循环语句:一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环结构是在 一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由 循环体及循环的终止条件两部分组成的。

C语言中使用循环结构就要用到:whilefordo while

4.1 while循环(do while类似)

在while循环中,break用于永久的终止循环(for,do while都适用)

代码如下:

int i=1;
while(i<=10)
{
    if(i==5)
        break;
    printf("%d ",i);
    i++;
}

结果输出:1 2 3 4

while循环中,continue是跳过本次循环continue后面的代码,直接去判断部分

(for,do while都适用)

大家可以思考一下,下面的代码输出什么:

int i=1;
while(i<=10)
{
    if(i==5)
        continue;
    printf("%d ",i);
    i++;
}

结果输出:1 2 3 4 后面死循环,因为当i=5时,就跳过了continue后面的语句,i不能自增,但是会再次进入 循环判断。

while( ( ch = getchar( ) ) != EOF )

(在键盘上按住Ctrl+z其实就是让getchar()读到了EOF,读取就结束)

大家可以自己先调试运行一下下面的代码:

int ch=0;
while((ch=getchar())!=EOF)
{
    putchar(ch);//输出字符
}

结果就是,如果你输入A回车,界面就会打印A,然后换行显示输入光标,当你在输入其他字符时回车后,也 是打印字符,回车,直到你Ctrl+z回车后,该循环才结束。

但是你知道getchar是怎么读入数据的吗?

了解getchar()是如何读取东西:(getchar和键盘之间有个缓冲区,并不是直接从键盘拿数据)

  • getchar是读取一个字符
  • 输入前缓冲区是空的,getchar就等待输入
  • 如果你输入 A回车,即将A\n放入缓冲区中,getchar先读到A,A就进入ch中,然后打印,再次循环时再读到\n,\n进入ch中,进行回车。故后面再输入时,就换了一行。

了解了getchar的读入原理后,下面有一段代码,其实有个错误,大家可以想想怎样修改:

char password[20] = { 0 };
printf("请输入密码>:");
scanf("%s", password);
printf("请确认密码(Y/N)>:");
int ch = getchar();
if ('Y' == ch)
{
 printf("确认成功\n");
}
else
{
 printf("确认失败\n");
}

假设密码是123456,当我们回车后。首先scanf读入123456,但是剩下的\n就被getchar接收了。

解决方案1:可以在这之前加一个getchar(),接收\n,以清理缓冲区。

但是如果这样做后,我们如果输入密码为12345 abcde,依旧会产生问题。

所以怎么办呢?增加getchar()的数量吗,那我们是不是可以用一个循环,直到getchar读入的为\n为止结束。 当我们再做确认的时候,ch就可以成功接收字符。代码如下:

char password[20] = { 0 };
printf("请输入密码>:");
scanf("%s", password);
printf("请确认密码(Y/N)>:");
int tmp = 0;
while ((tmp = getchar()) != '\n')
{
 ;
}
int ch = getchar();
if ('Y' == ch)
{
 printf("确认成功\n");
}
else
{
 printf("确认失败\n");
}

到这里大家应该已经清楚getchar的读入了,至于以上的密码接收有点问题,这里只是形象的举个例子,大家要是想的太多了,不用去纠结的。

4.2 do while循环

这里我有时老出现一个错误,故自己提出来。先大家先看以下的一段代码:(感觉一下是否有问题)

do
{
 int input=0;
 printf("请选择:>");
 scanf("%d", &input);
 switch (input)
 {
 case 0:
  break;
 case 1:
  break;
 default:
  break;
 }
} while (input);

我第一次写出这种代码时,编译就显示有错误,但我自己感觉很合理。因为本意是想输入0,就退出循环;输入其他的数字,就可以循环下去。
如果细心的话,大家就会发现,input的定义其实应该在do-while循环的外面。我当时就费解了一会,但是联想到while循环,就感觉这一切都说的通了。

像我这种情况,判断定义的变量,应该与循环在一个等级,就是在循环语句之外,就定义好。

4.3 for循环

语法结构:

for(表达式1;表达式2;表示式3)

​ 循环体

注意:

圆括号内的三个表达式在语法上都可以省,但两个分号“ ;”不可以省。for( ; ; )可以表示无限循环。

因为语法规定,判断部分省略表示真。

5、goto语句

goto语句:也称为无条件转移语句。其一般格式如:goto 语句标号; 其中语句标号是按[标识符]规定书 写的符号, 放在某一语句行的前面,标号后加[半角冒号]“:”。语句标号起标识语句的作用, 与 goto 语句配合使用。

用法: goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

注意: 1. 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。2.在结构化程序设计
中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

语句格式:

goto 语句标号:
...
语句标号:语句//----语句标号也可以在goto语句之前

可以通过下面两段代码比较,帮你理解:

int i=5;
if(i==5)
{
    goto start:
}
//代码1
start:
printf("A\n");
printf("B\n");
printf("C\n");
//代码2
printf("A\n");
printf("B\n");
start:
printf("C\n");

代码1输出A B C,而代码2,直接跳过A B,只输出C。

goto语句可以用于跳出多层循环,代码如下:

for()
{
 for()
 {
  for()
  {
   goto start;
  }
 }
}
start:
表达式

故goto最常见的用法是:终止程序在某些深度嵌套的结构的处理过程。

最后给大家写一个《关机程序》来帮大家理解goto语句,希望大家喜欢啦\(^ ^)/

#include <stdio.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
 again:
    printf("电脑将在1分钟内关机,如果输入:俺很喜欢这篇文章,就取消关机!\n请输入:>");
    scanf("%s", input);
    if(0 == strcmp(input, "我是猪"))
    {
     system("shutdown -a");
    }
    else
    {
     goto again;
    }
    return 0;
}

到此这篇关于C 语言基础之C 语言三大语句注意事项的文章就介绍到这了,更多相关C 语言三大语句注意事项内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一篇文章带你了解JavaScript-语句

    目录 表达式语句 复合语句和空语句 复合语句 空语句 声明语句 var function 条件语句 if if/else else if switch 循环 while do/while for for/in 跳转 标签语句 break语句 continue语句 return语句 throw语句 try/catch/finally语句 其他语句类型 with语句 debugger语句 "use strict" 总结表 总结 表达式语句 具有副作用的表达式是JavaScript中最简单的

  • Python基础之python循环控制语句break/continue详解

    Python中提供了两个关键字用来控制循环语句,分别是break和continue break在条件成立时,不会执行循环中的后续代码,并且会停止整个循环 continue在条件成立时,会不执行循环中的后续代码,并且会停止本次循环 接下来我们通过两个案例来区分这两个控制语句 首先使用while循环语句打印1到5之间的数字,循环到3的时候,我们使用continue关键字跳出3的这次循环,需要注意的是,continue在条件成立时,不会执行后续代码,如果在continue关键字前,没有改变循环的条件,

  • C语言控制语句之 循环

    入口条件循环:while循环 在执行多次循环之前之就已经决定是否执行循环 代码格式: while(关系表达式) 语句 //可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句. 关系表达式的结果有真(非0)执行和假(0)不执行两种状态 所以,我们发现while循环的终止条件很重要,要实现终止就必须让测试表达式的值产生变化,直到为假.while循环才可终止,否则,没有人为干预,它就不会停止(后面会学到使用if和break语句来终止循环,现在先不说) 看下面代码: #include <std

  • 论一条select语句在MySQL是怎样执行的

    目录 一.从宏观的角度分析MySQL 二.一条SQL执行要经过多少困难? 2-1 连接器 2-2 查询缓存 2-3 分析器 2-4 优化器 2-5 执行器 一.从宏观的角度分析MySQL 首先看一张经典图片(MySQL逻辑架构图) 上图的客户端可以直接理解为PHP.Java等.接下来,你会看到连接.线程处理.这一部分并不是MySQL所特有的,而且大多数客户端.服务器都具有类似的结构. 因此,一般而言,MySQL可以分为两层:Server层和存储引擎层. Server层主要包括连接层.查询缓存.分

  • C语言中常见的几种流程控制语句

    目录 1.goto语句 2.if语句 3.switch语句 4.while循环 5.do...while循环 6.for循环 break和continue 总结 1.goto语句 goto语句是一种无条件转移语句,goto 语句的使用格式为: goto  语句标号; 其中语句标号是一个有效的标识符,这个标识符加上一个 ":" 一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句: 另外语句标号必须与goto语句同处于一个函数中,但可以不在一个循环层中:通常go

  • C语言入门篇--学习选择,if,switch语句以及代码块

    目录 1.什么是语句 2.选择语句(分支语句) 2.1if语句&注意事项 2.1.1语法结构 2.1.2悬空else 2.2switch语句&注意事项 2.2.1语法结构 2.2.2switch语句中的break 2.2.3switch语句中的default语句 2.2.4switch语句的嵌套 3.代码块 1.什么是语句 语句:C语言中由一个 ; 隔开的就是一条语句. 例如: int a = 10; printf("haha\n"); 10; 'A'; ; //空语句

  • golang switch语句的灵活写法介绍

    switch是很容易理解的,先来个代码,运行起来 看看你的操作系统是什么吧 package main import ( "fmt" "runtime" ) func main() { fmt.Print("Go runs on ") switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux&quo

  • C语言之初始if语句详解

    目录 if语句有三种常见的使用方式 总结 if语句有三种常见的使用方式 1. if() //满足条件 .....//执行的功能 (不满足条件则不执行任何功能) 2. if() //满足条件 .....// 执行的功能 else //不满足条件 ...... //执行的功能 3. if() else if else if else if 可反复使用 else (可有可无) #include<stdio.h> int main() { int a=0; printf("请输入你的成绩:\

  • 如何用c++表驱动替换if/else和switch/case语句

    目录 C++的表驱动法 一.常用示例 二.表驱动法 三.C++实现注意 四.实用案例 C++的表驱动法 目的:使用表驱动法,替换复杂的if/else和switch/case语句. 一.常用示例 以switch为例,常用示例如下: Funcition() { switch (key) { case key1: statements 1; break; case key2: statements 2; break; ... case keyn: statements n; break; defaul

  • C语言进阶教程之循环语句缺陷详析

    目录 前言 1 循环语句的三要素 2 使用不同循环语句实现六种排列组合 2.1 第一种排列(ABC) 2.2 第二种排列(ACB) 2.3 第三种排列(BCA) 2.4 第四种排列(CBA) 2.5 第五种排列(BAC) 2.6 第六种排列(CAB) 3 什么时候用for循环语句 4 什么时候用while循环语句 5 什么时候用do-while循环语句 6 其他情况 7 总结 前言 你是否也有过下面的体会? 为什么刚开始学习C语言时很喜欢用for循环语句,但逐渐发现有经验的工程师都在用while

  • JavaScript中三种for循环语句的使用总结(for、for...in、for...of)

    前言 每个接触JS的开发人员都不可避免的与for循环打交道,毕竟这是遍历必不可少的工具之一.JavaScript 中的 for 循环语句相信大家都已经快用厌了,现在有好多文章都在讲怎么减少代码中的 for 循环语句,但是,你又不得不承认它们真的很有用.今天,我来总结一下前端 JavaScript 中三种 for 循环语句. for 这大概是应用最广的循环语句了吧,简单实用,且大多数时候性能还是在线的,唯一的缺点大概就是太普通,没有特色,导致很多人现在不愿用它. const array = [4,

  • mybatis中sql语句CDATA标签的用法说明

    sql语句CDATA标签的用法 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data). 在 XML 元素中,"<" 和 "&" 是非法的: "<" 会产生错误,因为解析器会把该字符解释为新元素的开始: "&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始: 在mapper文件中写sql语句时,遇到特殊字符时,如:"<&

  • Python实现switch/case语句

    目录 使用if-elif-elif-else 实现switch/case 使用字典 实现switch/case 在类中可使用调度方法实现switch/case 总结 使用if-elif-elif-else 实现switch/case 可以使用if-elif-elif..else序列来代替switch/case语句,这是大家最容易想到的办法.但是随着分支的增多和修改的频繁,这种代替方式并不很好调试和维护. 使用字典 实现switch/case 可以使用字典实现switch/case这种方式易维护,

随机推荐