首页 > 其他分享 >C语言入门 第三章 数据和变量

C语言入门 第三章 数据和变量

时间:2024-06-07 14:02:37浏览次数:25  
标签:第三章 常量 int 整数 C语言 类型 字节 变量 入门

目录

3.1 数据

3.1.1 整数

3.1.2 浮点数

3.2 变量与常量

3.2.1定义变量

 3.2.2变量分类

3.2.3变量的作用域与生命周期

 3.2.4 常量

 3.3 基本数据类型

 3.3.1 int类型

 3.3.2 其他整数类型

3.3.3 char类型

3.3.4 _Bool类型 

3.3.5 float、double和long double类型 


3.1 数据

        数据是所有能输入计算机并被计算机程序处理的符号的介质的总称,是用于输入电子计算机进行处理,具有一定意义的数字、字母、符号和模拟量等的通称。在计算机系统中,数据以二进制信息单元0、1的形式表示。

3.1.1 整数

        C语言中的整数和数学概念一样,是指没有任何小数或指数部分的数。例如,256、-2和1024都是整数;而3.14、2.00则不是整数。

3.1.2 浮点数

        C语言中的浮点数概念类似于数学中的实数,是具有分数形式或指数形式的数。例如,2.72、8.00、3.14E6和87e-2都是浮点数。

        书写浮点数需要详细介绍e计数法,也叫指数计数法,类似于科学计数法:科学计数法的数字写法为a×10^b,其中a为小于10的数,b为整数。在指数计数法中用e或E取代10^。

数字

科学计数法

指数计数法

100000000

1.0×108

1.0e8

3140000

3.14×106

3.14e6

0.87

8.7×10-1

8.7e-1

3.2 变量与常量

        生活中有些值是不变的(圆周率、血型、某事发生的日期),在C语言中,这些数据在程序运行期间没有变化,被称为常量。有些值是可变的(身高、体重、年龄),这些数据在程序运行期间可能被改变,被称为变量。 

3.2.1定义变量

int main(void){
    short age=20;   //age为变量名,表示年龄
    int high=170;   //身高
    float weight=63.5;   //体重
    return 0;
}

 3.2.2变量分类

1.局部变量(local variable)

        在函数内部的变量称为局部变量,作用域仅限于函数内部。

        main()函数中定义的变量也是局部变量;同时,main()函数中也不能使用其他函数中定义的变量。

        可以在不同函数中使用相同变量名,但应注意不要混淆。

 2.全局变量(global variable)

        在所有函数外部定义的变量称为全局变量,作用域默认是整个程序(包括.c和.h文件)。

3.2.3变量的作用域与生命周期

1.作用域(scope)

        作用域是程序设计概念。通常来说,一段程序代码中所用到的名字并不总是有效/可用的。而限定这个名字的可用性的代码范围就是这个名字的作用域。

(1)局部变量的作用域:变量所在的局部范围。

(2)全局变量的作用域:整个工程。

2.生命周期

        变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。

(1)局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。

(2)全局变量的生命周期:整个程序的生命周期。

3.extern关键字

        如果全局变量不在文件的开头定义,有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。

//简单理解,{}内部定义的变量是局部变量,{}外部定义的变量是全局变量
//在同一个范围内,变量不能重复定义
//全局变量和局部变量同名时,优先局部变量
#include<stdio.h>

int f1(void){
    int sum;
    int math=87,eng=72,comp=93;   //局部变量
    sum=math+eng+comp;
    return sum;
}

extern int subject=3;   //全局变量

int main(void){
    int average;   //局部变量
    average=f1()/3;
    printf("math=87,eng=72,comp=93,average=%d",average);
    return 0;
}

 3.2.4 常量

1.字面常量

        字面常量(literal constant)是直接出现在代码中的固定值,也称为直接量。它们表示不同类型的常量数据,如整数常量、浮点数常量、字符常量、字符串常量等。字面常量只能引用不能修改,通常保存在程序符号表中。程序无法读取字面常量的地址,只有一个例外,即字符串常量。字符串常量存放在静态数据区,可以通过指针指向它,但不能通过指针修改该常量。

        简单来说,字面常量的值就是字面本身,如整数25。

 2.const修饰的常变量

        const修饰的变量称为常变量,其是变量,但是具有常属性,即变量或对象的值是不能被更新的。可以这么说,变量是空间,常量是实际值;const只是锁定了值,但是并不能把空间变成数值。

        虽然常变量在代码中不能被直接修改,它们仍然保持着变量的属性。这种机制在一定程度上可以提高程序的安全性和可靠性,因为它防止了意外的修改,同时也为代码的可读性和维护性提供了便利。

        证明const修饰的常变量为变量的代码如下:

int main(void){
    const int n=10;
    int arr[n]={0};   //数组定义[]内必须是常量表达式
    return 0;
}
//程序报错,显示n为变量

 3.#define定义的标识符常量

        #define是C语言中的预处理指令,用于定义常量。一旦定义后,该常量在程序中就可以作为一个标识符使用,通常用来代替固定的数值或字符串。

#include<stdio.h>
#define MAX 100
int main(void){
    printf(“%d\n”,MAX);
    MAX=200;   //试图修改MAX的值
    printf(“%d\n”,MAX);
    return 0;
}
//程序报错,MAX为常量,定义后无法修改

 4.枚举常量

        enum 枚举类型名 {常量1,常量2,常量3,…};

        数据类型为int类型(默认)。

enum Color{
    red,
    green,
    blue
};
//枚举类型的这些名字不是变量,不会占据任何内存

int main(void){
    enum Color c=RED   //创建Color类型变量,此时向内存申请空间
    return 0;
}

 3.3 基本数据类型

         下表列出C语言编程中常用的基本数据类型:

数据类型

存储大小

范围

char

1字节

-128到127

signed char

1字节

-128到127

unsigned char

1字节

0到255

short

2字节

-32768到32767

signed short

2字节

-32768到32767

unsigned short

2字节

0到65535

int

2或4字节

-32768到32767

signed int

2或4字节

-32768到32767

unsigned int

2或4字节

0到65535

short int

2字节

-32768到32767

signed short int

2字节

-32768到32767

unsigned short int

2字节

0到65535

long int

4字节

-2147483648到2147483647

signed long int

4字节

-2147483648到2147483647

unsigned long int

4字节

0到4294967295

float

4字节

double

8字节

long double

10字节

        判断数据类型所占内存空间大小的代码: 

int main(void){
    printf(“%d\n”,sizeof(char));   //在一些编译器中可能会报警
    printf(“%zu\n”,sizeof(char));   //%zu表示打印一个sizeof的无符号返回值,单位为字节
    return 0;
}

 3.3.1 int类型

        int类型是有符号整型,可以具有零、正值和负值。

1.声明int变量

        第二章中已经用int声明过单个整型变量:先写上int,然后写变量名,最后以分号结尾。要声明多个int变量,可以单独声明每个变量,也可在int后列出多个变量名,之间用逗号分隔:

int n;
int a,b,c;

 2.初始化变量

        变量获得值有三种途径:赋值;通过函数传递值;初始化变量。

        初始化(initialize)变量就是为变量赋一个初始值,可以直接在声明中完成,其过程为为变量创建和标记存储空间并为其指定初始值。只需在变量名后面加上赋值运算符“=”和待赋给变量的值即可:

int totalNum=35,footNum=94;
int chicken,rabbits=12;
//正确,但是可读性差。
//最后一行只初始化了rabbits,并未初始化chicken。但这种写法容易被误认为chicken也被初始化为12,故不推荐采用

3.打印int

        可以使用printf()函数打印int类型的值。第二章中介绍过的%d称为转换说明,指定了printf()应用什么格式来显示一个值。格式化字符串中的%d与待打印列表中的int值按序依次对应。这个值可以使int类型的变量、常量或值为int类型的表达式:

printf(“雉兔同笼,头有%d只,脚有%d只,雉有%d只,兔有%d只”,totalNum,footNum,12,totalNum-12)

4.八进制和十六进制的显示

        在C语言中,不同的进制要使用不同的转换说明:十进制使用%d;八进制使用%o;十六进制使用%x;显示前缀0、0x和0X必须分别使用%#o、%#x、%#X。编译并运行以下程序:

//figure.c--以十进制、八进制、十六进制打印十进制数128
#include<stdio.h>
int main(void){
    int x=128;
    printf(“dec=%d,octal=%o,hex=%x\n”,x,x,x);
    printf(“dec=%d,octal=%#o,hex=%#x\n”,x,x,x);
    return 0;
}

         输出结果如下:

dec=128,octal=200,hex=80
dec=128,octal=0200,hex=0x80

 3.3.2 其他整数类型

        C语言提供3个附属关键字修饰基本整数类型:short、long和unsigned。

        打印unsigned int类型的值,使用%u转换说明;打印long类型的值,使用%ld转换说明(%lx表示以十六进制打印long类型整数;%lo表示以八进制打印long类型整数);打印short类型的值,可以使用h前缀(%hd表示以十进制打印short类型整数;%ho表示以八进制打印short类型整数);对于支持long long类型的系统,%lld和%llu分别表示有符号和无符号类型。第四章顺序结构中将详细介绍转换说明。

        如果整数超出了相应类型的取值范围会发生整数溢出。以下列代码为例讲解整数溢出: 

//程序power.c实现的功能是从2的0次方加到2的63次方
#include<stdio.h>
int main(void){
    int i,j,sum;
    i=1;
    sum=0;
    for(j=1;j<=63;j++){
        sum=sum+i;
    	i=i*2;
    }
    printf("%d",sum);
    return 0;
}

         整数溢出可分为三类:存储溢出,是使用另外的数据类型来存储整数造成的;运算溢出,是对整型变量进行运算时没有考虑到其边界范围;符号问题,是程序员忽略了符号。

        Unsigned int类型的变量达到能表示的最大值时会从0开始,而int类型的变量则从-2147483648开始。

        power.c中由于发生了运算溢出,导致输出数据由1.8446744e19-1变为-1。

3.3.3 char类型

        char类型用于存储字符,但从技术层面来看,char类型实际上存储的是整数而不是字符。计算机使用数字编码即特定整数表示特定字符。关于ASCII码的知识在第〇章中已讲过,在此不再赘述。

1.声明char类型变量

        char类型变量的声明方式与其他类型变量的声明方式相同。

2.字符常量的初始化

        如果要把一个字符常量初始化为字母A,只需直接将字母A赋给grade即可:

char grade=’A’;

        在C语言中,用单引号括起来的单个字符被称为字符常量(character constant)。单引号必不可少。以下是一些例子: 

char grade;	//声明一个char类型的变量
grade=’A’;	//正确赋值
grade=A;	//错误,A为变量
grade=”A”;	//错误,A为字符串
grade=65;	//正确,对于ASCII可以,但是一种不好的编码风格

        需要注意的是,C语言将字符常量视为int类型而非char类型。利用这个特性,定义的字符常量’FATE’也是有效的,相当于把4个独立的8位ASCII码存储在一个32位的存储单元中。

 3.非打印字符

        有些字符无法打印出来(例如,退格、换行)。C语言提供了三种方法表示这些字符:

        ①使用ASCII码。

        ②使用特殊符号序列,即转义字符(escape sequence)。使用转义序列赋给字符变量时,必须用单引号把转移序列括起来。转义字符序列如下表所示:

转义序列

含义

\a

警报(ANSI C)

\b

退格

\f

换页

\n

换行,也可用于刷新缓冲区

\r

回车

\t

水平制表符(实现Tab键功能)

\v

垂直制表符

\\

反斜杠(\),防止它被解释为一个转义序列符

\’

单引号

\”

双引号

\?

问号(在书写连续多个问号时使用,防止它们被解析成三字母词)

\0oo

八进制(oo必须是有效的八进制数,即每个o可表示0-7中的一个数)

\xhh

十六进制(HH必须是有效的十六进制数,即每个h可表示0-f中的一个数)

\0

字符串结束标志

        需要注意的是,这些转义字符不一定在所有的显示设备上都能起作用。例如,换页符和垂直制表符在PC屏幕上会生成奇怪的符号,只有将其输出到打印机上时才会产生描述的效果。

        ③从C90开始,可以用十六进制形式表示字符常量,即反斜杠后面跟一个x或X,再加上1-3位十六进制数字。例如,’\x41’表示’A’,’\x61’表示’a’。

4.打印字符

        由于一个字符变量实际上被存储为1字节的整数值,因此用%d打印char类型变量的值打印的是一个整数,而%c才是打印该整数对应的字符。

 5.有符号还是无符号

        有些编译器将char视为有符号类型,有些则将其视为无符号类型。具体请参照相应的编译器手册。

3.3.4 _Bool类型 

        _Bool类型用于表示布尔值,即逻辑值true或false,也是一种整数类型,占用1位存储空间。

3.3.5 float、double和long double类型 

        C语言中的浮点类型有float、double和long double类型。浮点数的表示主要分为三个部分:

        ①符号位:符号位为0表示正数,为1表示负数。

        ②阶码:在float中占用8位,在double中占用11位。用来表示浮点数的数量级,即指数部分。

        ③尾数(有效数):在float中占用23位,在double中占用52位。用来表示浮点数的有效数字部分,即其小数部分。

90253e40b67a421bb90dfefc945c5613.png

1.声明浮点型变量

        浮点型变量的声明和初始化方式与整型变量相同。

2.浮点型常量

        默认情况下,编译器假定浮点型常量是double类型的精度。在浮点数后面加上f或F可覆盖默认设置,使编译器将浮点数看做float类型。

3.打印浮点值

        关于如何通过设置字段宽度和小数位来控制输出格式的方法将在关于printf()函数的内容中详细展开。

        当浮点数超出当前类型所能表达的范围时,会发生上溢(overflow): 

#include<stdio.h>
main(void){
    float toobig=3.14e38*100.0f;
    printf(“%e\n”,toobig);   //%e是以指数的形式输出
    return 0;
}
//这种情况下会给toobig赋一个表示无穷大的特定值,而且printf()显示该值为inf或infinity(或者具有无穷含义的其他内容)

         当浮点数的阶码值太小,超出所能表示的最小负数,会发生下溢(underflow):

#include<stdio.h>
main(void){
    float toosmall=0.1234e-10/10f;
    printf(“%e\n”,toosmall);
    return 0;
}
//这时尾数部分会向右移,超出部分会被丢弃,得到的结果是0.0123e-10
//损失了类型全精度的浮点值称为低于正常的(subnormal)浮点值,其尾数位隐藏的整数部分为0

标签:第三章,常量,int,整数,C语言,类型,字节,变量,入门
From: https://blog.csdn.net/2301_78959712/article/details/139523897

相关文章

  • 【NOI】C++程序结构入门之循环结构二-for循环
    文章目录前言一、for循环1.导入2.语法3.使用场景4.条件控制5.小结二、例题讲解问题:1264-4位反序数问题:1085-寻找雷劈数问题:1057-能被5整除且至少有一位数字是5的所有整数的个数问题:1392-回文偶数?问题:1090-同因查找问题:1446.人口增长问题三、总结四、感谢......
  • Vue3入门 - vue3相比于vue2的优点,及如何创建Vue3项目
    目录一、认识Vue31.Vue2选项式API  vs Vue3组合式API2.Vue3的优势二、使用create-vue搭建Vue3项目1.认识create-vue2.使用create-vue创建项目3.熟悉项目和关键文件一、认识Vue31.Vue2选项式API  vs Vue3组合式API<script>exportdefault{......
  • 尚硅谷2024最新Java入门视频教程(上部)java零基础入门教程(1)
    快捷键硬件和软件的概念字节的概念dos命令jvm和跨平台jdk和jre jdk下载1.官网www.oracle.com配置环境变量java第一个程序的开发这里我发现虽然配置了系统环境变量,但是并不能在任何地方运行,我自己的理解是可能系统区分不了到底要运行......
  • Mybatis入门
    目录一、简介1.1、MyBatis历史1.2、特性1.3、下载1.4、和其它持久层技术对比二、搭建Mybatis2.1开发环境三、创建MyBatis的核心配置文件3.1、创建mapper接口3.2、创建MyBatis的映射文件3.3、通过junit测试对应功能3.4、加入log4j日志功能一、简介1.1、MyBatis历史MyBatis最初是......
  • 九、C语言:隐式类型转换(整型提升与算数转换)
    一、隐式类型转换C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。二、整型提升//1.表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作......
  • Three.js入门指南:从基础到实践的三维渲染之旅
    threejs相关资料threejs官网threejs案例安装(Installation)使用NPM和构建工具进行安装对于大多数用户而已,从npm包注册表中心安装并使用构建工具会是一个更推荐的方案。因为项目需要的依赖越多,就越有可能遇到静态托管无法轻易解决的问题。而使用构建工具,导入本地J......
  • ComfyUI 完全入门:必备插件
    ComfyUI 是一个基于StableDiffusion的AI绘画创作工具,最近发展势头特别迅猛,但是ComfyUI的上手门槛有点高,用户需要对StableDiffusion以及各种数字技术的原理有一定的了解才行。这个系列将会介绍ComfyUI的一些基础概念和使用方法,让大家更快的掌握ComfyUI的使用技巧,创......
  • .NET之Hangfire快速入门和使用
    原文地址:.NET之Hangfire快速入门和使用-追逐时光者-博客园(cnblogs.com)前言:定时任务调度问题,是一个老生常谈的问题。网上有许多定时任务调度的解决方案,对于我而言很早以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quartz.N......
  • 递推 7-1 sdut-C语言实验-母牛的故事
    7-1sdut-C语言实验-母牛的故事分数20全屏浏览切换布局作者 马新娟单位 山东理工大学有一对夫妇买了一头母牛,它从第2年起每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?输入格式:输入为一个整......
  • 7-3 sdut-C语言实验-骨牌铺方格
    7-3sdut-C语言实验-骨牌铺方格分数20全屏浏览切换布局作者 马新娟单位 山东理工大学斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,很多题目由此衍生而来,骨牌铺方格便是......