【C语言】数据类型和变量(内容丰富,超详细~)

2024-04-23 1010阅读

温馨提示:这篇文章已超过381天没有更新,请注意相关的内容是否还可用!

目录

一、标识符

标识符的介绍及命名规则

二、关键字

三、数据类型

数据类型介绍

基本数据类型

整型

字符型

布尔类型(C99)

四、各种数据类型的长度

计算机的存储单位换算

sizeof 操作符

signed 和 unsigned

数据类型长度

sizeof中的表达式不计算

五、数据类型的取值范围

六、转义字符

七、ASCII 码表

八、常量、变量

常量 

变量

变量的创建

全局变量

局部变量

 全局变量和局部变量在内存中的存储


【C语言】数据类型和变量(内容丰富,超详细~)

一、标识符

  • 标识符的介绍及命名规则

    标识符介绍

    在C语言中为了在程序运行过程中可以使用常量、变量、函数等,就要为这些形式设定一个名称,这个名称就是所谓的标识符。

    简单来说,标识符就是名字,主要用于给变量、常量、函数、数组等命名,就像每个人都有一个名字,如张三、李四等。

    名字是可以随便取的,但还是应该在满足一定命名规则的基础上自由发挥。

    标识符的命名规则

    • 由字母、数字、下划线组成
    • 不能以数字开头
    • 区分大小写
    • 不能使用关键字命名
    • 命名最好具有相关含义
    • ANSI标准规定,标识符可以为任意长度,但外部名必须至少能由前8个字符唯一区分(这是因为某些编译程序如IBM PC的MS C仅能识别前8个字符)

      【C语言】数据类型和变量(内容丰富,超详细~)


      二、关键字

       C语言的关键字是C语言程序中已经预定义好的具有特殊意义的单词,它们不能作为变量名、函数名或其他标识符使用。

      C语言的关键字是固定的,不能自定义或更改。

      C语言的32个关键字,如下表 

      auto声明自动存储类别的局部变量
      break跳出循环或switch分支
      caseswitch语句的选择分支
      char声明字符型变量或函数
      const声明只读变量,即常量
      continue在循环中,跳过当前循环的剩余部分,开始下一次循环
      default在switch语句中,处理其他情况
      do创建一个执行语句块直到满足特定条件的循环
      double声明双精度浮点型变量或函数
      else与if语句一起使用,指定当if条件不满足时执行的代码块
      enum声明枚举类型和枚举常量
      extern声明变量或函数是在其他文件或模块中定义的
      float声明单精度浮点型变量或函数
      for创建一个循环,指定初始条件、循环条件和循环迭代
      goto无条件跳转到程序中指定的标签位置
      while创建一个循环,只要指定条件为真就执行循环体
      int声明整型变量或函数
      long声明长整型变量或函数
      register建议编译器将局部变量存储在寄存器中,以提高访问速度(但现代编译器通常会自动优化)
      union声明联合类型,允许在相同的内存位置存储不同的数据类型
      short声明短整型变量或函数
      signed声明有符号类型变量或函数
      sizeof获取特定类型或对象所占空间大小(以字节为单位)
      static声明静态变量或函数,函数内部定义时具有文件作用域,函数外部定义时具有内部链接性
      struct声明结构体类型
      switch基于不同条件执行不同代码块的多路分支结构
      typedef为数据类型定义新名称
      return从函数中返回值
      unsigned声明无符号类型变量或函数
      void声明函数无返回或无参数,声明指针为空类型指针
      votatile告诉编译器不要优化对该变量的访问,因为该变量的值可能会在程序不知情的情况下改变
      if用于条件判断

       C语言标准可能会随着版本的更新而有所变化,例如C99标准就增加了一些新的关键字。

      在C99标准中加入了 intline、restrict、_Bool、_Complex、_Tmaginary等关键字,不过使用最多的还是上面32个关键字。


      三、数据类型

      • 数据类型介绍

        在生活中,有各种不同的数据,例如你的姓名、年龄、商品的价格、考试成绩等等,C语言提供了丰富的数据类型来描述这些数据。用整型来描述整数,浮点型(实型)来描述小数,字符型来描述字符,布尔类型来描述真假,如你的年龄是18岁,那就是整数类型,书的价格32.8元、考试成绩90.5分,那就是浮点数类型。

        类型,也就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作。

        下图为C语言中的数据类型分类

        【C语言】数据类型和变量(内容丰富,超详细~)

        • 基本数据类型

          了解了C语言中的数据类型有哪些,我们先来学习其中的基本数据类型。

          关于signed,unsigned 以及基本数据类型所占空间大小和取值范围,下文会进行介绍,先了解各个基本数据类型。

          下文中 [ ]中的内容可以省略

          整型

          整型就是我们所说的整数类型,例如 -2,0,1,15,20等。

          整型根据所占内存空间大小,又分为短整型,整型,长整型, 更长的整型(C99)

          //短整型
          short [int]
          [signed] short [int] 
          unsigned short  
          //整型
          int 
          [signed] int  
          unsigned int
          //长整型
          long [int]
          [signed] long [int] 
          [unsigned] long [int] 
          //更长的整型
          //C99中引入
          long long [int]
          [signed] long long [int] 
          [unsigned] long long [int] 

          在编写整型常量时,可以在常量的后面加上符号 L或者U来修饰 。

          L 或者 l 表示该常量是长整型,U 或者 u 表示该常量为无符号整数。

          LongNum = 100L;  // L表示长整型
          UnsignNum = 25U; // U表示无符号整型

          整型常量可以通过3种形式进行表达,分别为八进制形式、十进制形式和十六进制形式。 

          八进制整数:要想所使用的数据表达形式是八进制,需要在常数前加上 0 作为前缀进行修饰,八进制所包含的数字为 0~7

          十进制整数:不需要在常量前面加前缀,所包含的数字是 0~9

          十六进制整数:在常量前加上 0x 作为前缀进行修饰,包含数字是 0~9 以及字母A~F(其中字母A~F可以是大写,也可以是小写)

          //八进制
          num1 = 0123;
          num2 = 0456; 
          //以下关于八进制的写法是错误的
          num3 = 145; //没有前缀
          num4 = 0489;//包含非八进制数8和9
          //十进制
          num1 = 123;
          num2 = 569;
          //以下关于十进制的写法是错误的
          num3 = 0156; //有前缀0,该数为八进制
          num4 = 0x156; //有前缀0x,该数为十六进制
          //十六进制
          num1 = 0x234;
          num2 = 0x4a5c;
          //以下关于十六进制的写法是错误的
          num3 = 158; //没有前缀0x
          num4 = 0x95j4; //包含非十六进制数的字母j

           浮点型(实型)

          浮点型就是我们所说的小数类型,例如 -1.2,0.5,3.14,5.20等。

          浮点型,也称为实型,分为单精度浮点型,双精度浮点型,长双精度浮点型。它们的精确范围由小到大。

          float   //单精度浮点型
          double  //双精度浮点型
          long double  //长双精度浮点型

          float :精确到小数点后 6 位

          double : 精确到小数点后 15 位 

          long double : 精度通常至少与 double 相同,有时更高,取决于编译器和平台

          由于这些类型有不同的存储大小和精度,因此在进行浮点数运算时,选择正确的类型是很重要的,如果你需要更高的精度,那么可以选择使用 double 或 long double。 

          在编写浮点型常量时,可以在常量后面加上符号 F 或 L 修饰。

          F 或者 f 表示该常量是单精度浮点型,L 或者 l 表示该常量是长双精度浮点型

          如果不在后面加上后缀,在默认状态下,该常量是 double 双精度类型

          num1 = 3.12f; //float型
          num2 = 2.54; //double型
          num3 = 0.45L; //long double型

           浮点型由整数部分和小数部分组成。表示浮点型的方式有科学计数方式和指数方式

          科学计数方式:使用十进制的小数方法。例如1.2,2.5

          指数方式:使用字母 e 或者 E 进行指数显示 。例如12e2 , 56e-3

          //科学计数法
          num1 = 2.1;
          num2 = .14; //可以省略整数部分,小数点前没有数字,这里就认为是 0.14
          //指数方式
          num1 = 1.52e3; //表示1520
          num2 = 2.8E-2;//表示0.028
          字符型

          字符型,是用来存储字符的,例如英文字母或标点等,严格来说,字符型其实也是整型,因为字符型数据存储的实际上是整数(字符的ASCII码值),而不是字符。例如ASCII用65代表大写字母A,因此存储字母A实际上存储的是整数65。ASCII码值后面会介绍。

          char  //character
          [signed] char  //有符号的
          unsigned char  //无符号的

           字符型常量分为字符常量和字符串常量。

          字符常量:用单引号 ' ' 括起来的一个字符。例如 'A' , '#' , '='

          字符串常量:用双引号 " " 括起来的若干字符序列。例如 "hello!", "am is are"

          字符常量

          1. 只能包括一个字符。例如 'A' 是正确的,'Ab'是错误的

          2. 区分大小写。例如 'A' 和 'a' 是不一样的

          3. 单引号 ' '代表定界符,不属于字符常量中的一部分

          字符串常量 

          1. 如果字符串中一个字符都没有,称为空串,此时字符串中的长度为0

          2. C语言存储字符串常量时,系统会在字符串的末尾自动加一个 " \0 " 作为字符串的结束标志

          例如,字符串 "Hello" 在内存中的存储形式如下图

          【C语言】数据类型和变量(内容丰富,超详细~)

          在编写字符串常量时,不必在一个字符串的结尾处 加上 " \0 "结束字符,系统会自动添加结束字符

          【C语言】数据类型和变量(内容丰富,超详细~) 上面介绍了字符常量和字符串常量,那么同样是字符,它们之间有什么差别吗?

          字符和字符串的区别:

          1. 使用的定界符不同。字符常量使用单引号 ' ',字符串常量使用双引号 " "
          2. 长度不同。字符常量只有一个字符,那么长度就是1。字符串常量的长度却可以是0,即使字符串中只有一个字符,长度是2,不是1。因为字符串末尾还含有 \0 作为结束标志。
          3. 存储方式不同。在字符常量中存储的是字符的ASCII码值,但在字符串常量中,不仅要存储有效的字符,还要存储结尾处的 \0

          【C语言】数据类型和变量(内容丰富,超详细~)

          布尔类型(C99)

          C语言中原本并没有为布尔值单独设置一个类型,而是使用整数0表示假,非零值表示真。

          在C99标准中引入了布尔类型,专门用来表示真假

          在布尔类型中,变量取值只有两种,要么是true,要么是false,不会出现第三种。

          true 表示真   false 表示假

          _Bool

          使用布尔类型,需要包含头文件  

          我们在定义布尔类型时,可以将 _Bool 写为 bool,原因如下:

          我们在VS2022上输入bool ,选中 bool 右击鼠标,点击转到定义

          【C语言】数据类型和变量(内容丰富,超详细~)

          可以看到上面把 _Bool 定义为 bool , 所以 bool 等同于 _Bool 

          【C语言】数据类型和变量(内容丰富,超详细~)

          代码演示:

          _Bool flag = true;
          if(flag)
              printf("为真");
          else
              printf("为假");

          四、各种数据类型的长度

          • 计算机的存储单位换算

            计算机内部的数据以二进制表示,由0和1组成,逢二进一

            计算机中最小的数据单位是 位(b),存储容量的基本单位是 字节(Byte),8个二进制位称为1个字节。

            计算机中的数据大小通常以字节(Byte)作为基本单位

            【C语言】数据类型和变量(内容丰富,超详细~)

            • sizeof 操作符

              sizeof 是一个关键字,也是一个操作符,是专门用来计算sizeof的操作数的类型长度的,单位是字节。

              sizeof 的操作数可以是类型,也可以是变量或者表达式,如果是表达式,则括号可以省略

              sizeof(类型)
              sizeof(表达式) //如果 sizeof 后面是表达式,可以省略括号

              sizeof 后面的表达式不真实参与运算,是根据表达式的类型来得出大小

              sizeof 的计算结果是 size_t 类型的 

              sizeof 的返回值,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己决定,sizeof 返回什么类型呢?不同的系统中,返回值的类型可能是  unsigned int , 可能是 unsigned long , 也可能是 unsigned long long,对应的 printf( )的占位符分别是 %u 、%lu、%llu。这样不利于程序的可移植性。

              所以C语言提供了一个解决方法,创造了一个类型别名 size_t ,用来统一表示 sizeof 的返回值类型。

              例如下面的代码

              int main()
              {
              	int a = 5;
              	printf("%zd\n", sizeof(a));
              	printf("%zd\n", sizeof a); //a是变量的名字,可以省略sizeof后面的括号
              	printf("%zd\n", sizeof(int));
                  printf("%zd\n", sizeof(2 + 1.5));
              	return 0;
              }

              代码结果如下 

              【C语言】数据类型和变量(内容丰富,超详细~)

              a 的值是 5 ,而 5 是整型,int 占4个字节,所以输出 4 

              最后一个 2+1.5 中的 1.5 是 double 类型,double 占8个字节,所以输出 8,这里的2+1.5是不参与运算的

              • signed 和 unsigned

                C语言使用 signed 和 unsigned 关键字来修饰字符型和整型。

                signed:有符号的,表示这个类型带有正负号,包含负值

                 unsigned:无符号的,表示这个类型不带正负号,只能表示0和正整数

                对于 int 类型 ,默认是带有正负号的,所以 int 就等同于 signed int 

                由于这是默认情况,所以 signed 一般都省略不写,写了也是正确的,不过稍微麻烦点

                int 
                //等同于 signed int

                当你使用的 int 类型表示 负整数 时,就必须使用关键字 unsigned 声明变量

                unsigned int a = -1;
                • 数据类型长度

                  我们了解了基本数据类型和 sizeof 的用处,接下来就是利用sizeof 来看看基本数据类型的长度

                  sizeof 可以获取特定类型或对象在内存中所占用的空间大小,单位是字节

                  【C语言】数据类型和变量(内容丰富,超详细~)

                  我们可以看到这些基本数据类型的长度分别为1字节、1字节、2字节....

                  其中有一点,long 的存储范围比 int 更大,不应该是 long 的长度比 int 大吗? 为什么它们的长度都是4呢?

                  原因是:C语言标准规定 int 至少和 short 一样长,long 至少和 int 一样长,这个规则同样适用于浮点型,long double 至少和 double一样长,double 至少和 float 一样长。

                  然而,这并不意味着 long一定比 int 长或 int 一定比 short 长,它们之间的具体大小取决于编译器和平台。

                  sizeof(char) == 1
                  sizeof(char) 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]