新手小白初次接触C语言我们要了解什么呢?(二)

简介: M是常量,不可被修改//标识符常量是常量//定义一个整形数组,最多放10个元素。

目录

一、常量

1.1字面常量

1.2const修饰的常变量

1.3#define定义的标识符常量

1.4枚举常量

二、字符串+转义字符+注释

2.1字符串

2.2转义字符

2.2.1转义字符含义

2.2.2 笔试题

2.2.3区别

三、注释

四、选择语句

五、循环语句

六、函数

七、数组

7.1 数组定义

7.2 数组的下标

7.3 数组的使用


一、常量

C语言的常量通常分为以下几种

    • 字面常量
    • const修饰的常变量
    • #define定义的标识符常量
    • 枚举常量

    1.1字面常量

    int main()
    {
        //字面常量
        5;//整型
        100;
        3.14;//浮点型
        'w';//字符型
        “abcdef”;//字符串型
    }

    image.gif

    1.2const修饰的常变量

    int num = 100;
      num = 200;
      printf("%d", num);//200
      const int num2 = 100;//此时num2不可被修改
    //使变量具有常量的属性,就为常变量,但编译器认为它还是变量
      num2 = 300;
      printf("%d", num2);
      return 0;
    报错:E0137:表达式必须是可修改的左值

    image.gif

    如何验证const修饰的变量具有常量的属性,但依旧是变量呢?

    int n = 10;
      int arr[n] = { 0 };
        报错:C2057:应输入常量表达式

    image.gif

    当我用const修饰时:

    const int n = 10;
      int arr[n] = { 0 };
        报错:E0028:表达式必须含有常量值
    //可见const修饰n具有常量的属性(不可更改),但编译器认为n依旧是变量

    image.gif

    (举个栗子理解一下常变量:中国人拿到了美国国籍,但依旧是中国人)

    1.3#define定义的标识符常量

    #define M 100
    int main()
    {
      printf("%d\n", M);//100
      //M=200;M是常量,不可被修改
      int arr[M] = { 0 };//标识符常量是常量
    }

    image.gif

    1.4枚举常量

    枚举-----一一列举

    //血型、性别、三原色等等

    enum Color//enum是枚举关键字
    {
    //RED、GREEN、BLUE是枚举类型Color的可能取值,同时也是常量,叫做枚举常量
      RED,
      GREEN,
      BLUE
    };
    int main()
    {
      enum Color c = BLUE;//为c赋值为蓝色
      //验证他们是常量
      printf("%d\n", RED);//0
      printf("%d\n", GREEN);//1
      printf("%d\n", BLUE);//2
      //编译器默认给他们0、1、2的值,不可被更改
      return 0;
    }

    image.gif


    二、字符串+转义字符+注释

    2.1字符串

    “hello world”

    image.gif

    1.由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。

    注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。

    int main()
    {
      //当我们存取多个字符时,就需要创建一个数组
      char ch1[] = {'a','b','c'};//三个元素
      char ch2[] = "abc";//四个元素
      //这两个数组有什么区别呢?
        //%s打印字符串,打印到'\0'才停止
        printf("%s",ch1);
        printf("%s",ch2);
      return 0;
    }

    image.gif

    image.gif编辑image.gif编辑

    通过上图可以看出:ch2实际上在末尾有'\0'作为字符串的结束标志,隐藏在字符串中看不见。

    当我们分别打印ch1和ch2时,打印效果如右图,为什么会出现这样的效果呢?

    接下来通过内存画图解释一下:

    image.gif编辑

    在ch1中,打印完a,b,c后根本不知道'\0'在哪里,所以后面会打印随机值,出现了烫烫,遇到'\0'后才停止。

    image.gif编辑

    在ch2中打印完a,b,c后遇到'\0',停止打印。

    这时候我们会想:如果我们在ch1后面加一个'\0'呢?

    char ch1[]={'a','b','c','\0'};//此时有'\0'了,ch1中就有四个元素
    printf("%s",ch1);

    image.gif

    我们查看内存后发现:image.gif编辑

    2.通过上面的注意我们理解一下:在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。

    我们需要通过计算字符串的长度,在C语言中:提供了一个库函数可以计算字符串的长度,strlen()

    (string length),他需要包含一个头文件#include<string.h>

    #include<string.h>
    int main()
    {
      char ch1[] = {'a','b','c'};//三个元素
      char ch2[] = "abc";
        int len1 = strlen(ch1);
      int len2 = strlen(ch2);
      printf("%d\n", len2);
        printf("%d\n", len1);
      return 0;
    }

    image.gif

    计算结果为:len1=随机值。len2=3。为什么len2结果是3呢?

    image.gif编辑也就是说strlen统计的是'\0'之前的字符的个数。不算'\0'

    但是len1的结果是随机值,因为我不知道'\0'的位置在哪里,所以'\0'之前的字符的个数是随机的。

    2.2转义字符

    2.2.1转义字符含义

    首先我们看下面这个例子:

    image.gif编辑image.gif编辑

    转义:转变原来的意思

    假如我们要在屏幕上打印一个目录: c:\code\test.c

    int main()
    {
     printf("c:\code\test.c\n");
        return 0;
    }

    image.gif

    image.gif编辑

    我们发现压根就打印不出想要的效果,因为被转义了。

    image.gif编辑

    简单讲几个:

    image.gif编辑 奇葩的退格符

    通常用来考试image.gif编辑

    举个栗子:image.gif编辑

    image.gif编辑为什么打印的是;呢?八进制(由0~7组成)的073,通过计算为十进制我们知道:在内存中的字符是通过二进制是不好存储的,我们就对符号编个值,也就是ASCII编码。通过对应ASICII我们发现59的ASCII码值对应的字符是;

    image.gif编辑 打印结果是:F

    通过计算得:70对应的是F

    image.gif编辑

    image.gif编辑

    2.2.2 笔试题

    //程序输出什么?
    //求字符串长度:
    #include <stdio.h>
    int main()
    {
        printf("%d\n", strlen("abcdef"));//6
        // \62被解析成一个转义字符
        printf("%d\n", strlen("c:\test\628\test.c"));
        return 0;
    }

    image.gif

    请问:下面那个结果是几呢?

    结果是:14,转义字符占一个字符的长度。(\t,\62,\t)

    为什么不是13呢?因为\ddd是八进制数,范围是0~7,所以不是\628

    2.2.3区别

    接下来区别一下:

    数字:0,字符:'0'的本质是对应ASCLII的48,转义字符:'\0'的本质是0


    三、注释

      1. 代码中有不需要的代码可以直接删除,也可以注释掉
      2. 代码中有些代码比较难懂,可以加一下注释文字
      int main()
      { //定义一个整型变量a,给a赋值10
        int a = 20;
        return 0;
      }

      image.gif

      注释风格:

        1. C语言风格的注释 /*xxxxxx*/。缺陷:不能嵌套注释
        2. C++风格的注释 //xxxxxxxx。可以注释一行也可以注释多行

        例如:

        image.gif编辑C语言注释风格下,从/*开始,在函数内部已经出现/*,*/,但是当第一个/*遇到*/就会注释停止,所以会发生如图情况,导致后面内容无法被注释掉。缺陷是:不能嵌套注释


        四、选择语句

        #include <stdio.h>
        int main()
        {
            int coding = 0;
            printf("你会去敲代码吗?(选择1 or 0):>");
            scanf("%d", &coding);
            if(coding == 1)
           {
               prinf("坚持");
           }
            else
           {
               printf("放弃");
           }
            return 0;
        }

        image.gif


        五、循环语句

          • while语句
          • for语句
          • do ... while语句
          #include <stdio.h>
          int main()
          {
              printf("努力学习\n");
              int line = 0;
              while(line<=20000)
             {
                  line++;
                  printf("我要继续努力敲代码\n");
             }
              if(line>20000)
                  printf("好offer\n");
              else
                  pirntf("天天编程");
              return 0;
          }

          image.gif


          六、函数

          #include <stdio.h>
          int main()
          {
            int num1 = 0;
            int num2 = 0;
            int sum = 0;
            printf("输入两个操作数:>");
            scanf("%d %d", &num1, &num2);
            sum = num1 + num2;
            printf("sum = %d\n", sum);
            return 0;
          }
          上述代码,写成函数如下:
          #include <stdio.h>
          int Add(int x, int y)
          {
            int z = x + y;
            return z;
          }
          int main()
          {
            int num1 = 0;
            int num2 = 0;
            int sum = 0;
            printf("输入两个操作数:>");
            scanf("%d %d", &num1, &num2);
            sum = Add(num1, num2);
            printf("sum = %d\n", sum);
            return 0;
          }

          image.gif

          函数的特点就是简化代码,代码复用。


          七、数组

          7.1 数组定义

          int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素

          image.gif

          7.2 数组的下标

          C语言规定:数组的每个元素都有一个下标,下标是从0开始的。

          数组可以通过下标来访问的。

          int arr[10] = {0};
          //如果数组10个元素,下标的范围是0-9

          image.gif

          image.gif编辑

          7.3 数组的使用

          #include <stdio.h>
          int main()
          {
            int i = 0;
            int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
            for (i = 0; i < 10; i++)
            {
              printf("%d ", arr[i]);
            }
            printf("\n");
            return 0;
          }

          image.gif

          image.gif编辑

          int main()
          {
            //若执行小数除法,除号左右两端至少有一个是小数
            printf("%d\n", 7 / 2);
            printf("%lf\n", 7 / 2);
            printf("%lf\n", 7.0 / 2);
            /*3
            0.000000
            3.500000*/
            int arr[10];
            printf("%d\n", sizeof(arr));
            printf("%d\n", sizeof(arr[0]));
            //数组元素个数的计算方法:
            int sz = sizeof(arr) / sizeof(arr[0]);
            printf("%d\n", sz);
            char arr1[] = "abc";
            char arr2[] = { 'a','b','c' };
            printf("%d\n", strlen(arr1));
            printf("%d\n", strlen(arr2));
            printf("%d\n", sizeof(arr1));
            printf("%d\n", sizeof(arr2));
            /*
            3
            15
            4
            3
            */
            //strlen是库函数
            //strlen是求字符串长度的,关注的是字符串中是否有\0,统计\0之前出现的字符个数
            //sizeof是操作符
            //sizeof只关注占据了多大的内存空间,不关注内存中存放的数据
            //size返回值的单位是字节
          }

          image.gif

          strlen和sizeof的区别

          strlen是库函数

          strlen是求字符串长度的,关注的是字符串中是否有\0,统计\0之前出现的字符个数

          sizeof是操作符

          sizeof只关注占据了多大的内存空间,不关注内存中存放的数据

          size返回值的单位是字节

          目录
          相关文章
          |
          存储 移动开发 数据安全/隐私保护
          高效反编译luac文件
          高效反编译luac文件
          |
          7月前
          |
          人工智能 监控 API
          AI Agent 落地实战:破解「浮光行为」困局与开发者职业进阶体系
          2024年AI Agent进入落地关键期,但“浮光行为”成核心障碍:表面自动化、实则脱离业务本质。本文揭示其三大工程特征与风险,提出开发者从提示词搭建到多智能体编排的三级进阶路径,倡导以业务建模、元认知技术与系统思维构建真正闭环的智能体系统。
          468 0
          |
          9月前
          |
          人工智能 运维 自然语言处理
          当图表不够用了:数据可视化正悄悄进化成“智能洞察”
          当图表不够用了:数据可视化正悄悄进化成“智能洞察”
          498 13
          |
          缓存 Java Spring
          Java本地高性能缓存实践问题之Caffeine中设置刷新机制的问题如何解决
          Java本地高性能缓存实践问题之Caffeine中设置刷新机制的问题如何解决
          853 1
          HarmonyOS实战:腾讯IM之消息删除、撤回和重发(三)
          本文详细介绍了鸿蒙 IM 聊天中实现消息撤回、删除和重发功能的方法。消息撤回支持在 120 秒内召回自己发送的消息,通过 `revokeMessage` 方法实现;消息删除使用 `deleteMessage` 方法清除本地与云端记录;消息重发则先删除失败消息再重新发送,并处理用户被拉黑的异常情况。结合状态管理,可轻松实现类似微信的功能,建议点赞收藏并动手实践!
          744 3
          HarmonyOS实战:腾讯IM之消息删除、撤回和重发(三)
          |
          网络协议 网络架构
          计算机网络——计算机网络体系结构(1/4)-常见的计算机网络体系结构(OSI体系、TCP/IP体系、原理体系五层协议)
          计算机网络——计算机网络体系结构(1/4)-常见的计算机网络体系结构(OSI体系、TCP/IP体系、原理体系五层协议)
          732 0
          |
          前端开发
          CSS3:hover&demo
          本文介绍了CSS中`hover`伪类的基本用法,包括改变元素自身样式、影响子元素及相邻或后续兄弟元素样式的技巧。同时,还探讨了`:before`和`:after`伪元素的使用方法,以及如何通过CSS实现边框流动效果、创建登录页面、设计轮盘游戏界面和平滑处理文本溢出等实用案例。每个示例都配有代码块,便于理解和实践。
          548 4
          |
          前端开发 JavaScript
          深入理解前端状态管理:React、Redux 和 MobX
          【10月更文挑战第7天】深入理解前端状态管理:React、Redux 和 MobX
          657 0
          |
          NoSQL 数据可视化 关系型数据库
          MongoDB提供的这些工具
          【6月更文挑战第8天】MongoDB提供的这些工具
          1123 3