C语言基础:常量与变量和基本类型数据

主要内容

  • 常量与变量
  • 基本类型数据

常量与变量

在C语言中,数据的基本表现形式是常量和变量。不管是常量还是变量, 都是需要在内存中申请一块空间,用于数据的存放。

常量

  • 定义:在程序执行过程中其值不不能被改变的量。
  • 分类:int、float、double、char和符号常量
整型常量
  • 整型常量可以用十进制、八进制、十六进制三种形式表示。

    • 十进制常量:由0~9的数字组成,没有前缀,不能以0开头(举例:99,218,注意:0是可以的,但是09是不可以的)
    • 八进制常量:以0为前缀,其后由0~7数字组成,没有小数部分。(举例:023,077)
    • 十六进制常量:以0x或者0X为前缀,其后由数字0~9和字母A~F(大小写均可),没有小数部分。(举例:0x00FF0000)

    整型常量中的长整型数据可用 L或者l 作为后缀,(举例:long num = 123L)

  • 整型常量的分类

    • 有符号与无符号基本整型常量
    • 有符号与无符号长整型常量
    • 有符号与无符号短整型常量
  • 整形

    • 十进制表示:可以使用10个数字符号0~9以及 +,- ,如:123,-90
    • 八进制表示:以0开头,可以使用7个数字符号0~7以及 +,- ,如:0123,-011
    • 十六进制制表示:以0x或者0X开头,可以使用 0~9 以及 A~F(a~f) ,如:0x12,-0x12
浮点型常量

C语言中浮点数就是平常所说的实数(实型数),有两种表现形式:

  • 十进制小数形式:如:0.123,-17.8,0.123F
  • 指数形式(科学计数法),如:1.96e-5可以写作 1.96 ∗ 1 0 − 5 1.96 * 10^{-5} 1.96105,1230.0可以表示为 1.23 ∗ 1 0 3 1.23*10^3 1.23103,也可以表示为:1.23e3

注意:

​ ①在符号e的前面必须要有数字。

​ ②在符号e的后面必须为整数,不能是带有小数点的实数型。实型常量的后缀用F(或f)表示单精度型。后缀用L(或l)表示双精度型。

字符常量

用单引号''括起来的一个字符,如:‘a’、‘A’、‘4’、'_'等,比如:'齐’就不是字符,一个汉字所占的字节数超过1个字符。中文符号当成汉字理解。英文输入法下输入的字母、数字、符号都是单字符

序号字符形式含义ASCII码
1\n换行10
2\r回车13
3\0空字符0
4\t水平制表符9
字符串常量

说明:在C语言中,是支持字符串常量的,但是不支持字符串变量。字符串变量需要使用字符数组或者字符指针实现。

  • 用一对双引号""括起来的一个字符序列,如:"How do you do?

    yuyuan!",“YueQian”,“12”,“true”,"12.25"等。

  • 可以输出一个字符序列,如:printf(“%s”,“hello world\n”); | printf(“hello world\n”);

注意:

字符常量=='a’与字符串常量"a"==的区别:

在这里插入图片描述

系统自动为字符串常量加上结尾的 \0 ,使所占内存单元多一个,单字符常量的长度不变,可用sizeof()运算符来测量。

符号常量

定义一个表示符来代表一个常量。

如:用PI代表圆周率π,即:3.1415926

  • 好处:

    • 增加可读性
    • 增强了可维护性
  • 定义字符常量:

    • 用编译预处理指令 #define

    • 格式:

      #define 标识符 字符串
      
      • 标识符和字符串之间用空格隔开
      • 句末不用分号
      • 标识符的命名采用大写,如果有多个单词,使用下划线分隔,举例:MAX_VAL,MIN_VAL
    • 规范:

      /*************************************************************************
      > File Name: demo01.c
      > Author: FPF
      > Description: 输出 hello,world
      > Created Time: 2025年01月20日 星期一 10时53分39秒
      ************************************************************************/
      
      #include <stdio.h>
      
      // 定义一个符号常量PI
      #define PI 3.1415926
      #define R 20
      
      int main(int argc,char *argv[])
      {
      	// 计算圆周长 2×PI×R
      	printf("计算圆周长:%f\n",2*PI*R);
      	// 计算圆面积 PI*R*R
      	printf("计算圆面积:%f\n",PI*R*R);
      	return 0;
      }
      

变量

  • 定义:在程序执行过程中其值可被改变的量,称之为变量。

  • 变量代表内存中具有特定属性的一个存储单元,它是用来存储数据的,也就是存放变量的值。

  • 变量应该有一个名字,以便于通过名字访问变量。

    在这里插入图片描述

格式
数据类型 变量名列表;
范例
/*************************************************************************
> File Name: demo01.c
> Author: FPF
> Description: 变量的定义
> Created Time: 2025年01月21日 星期二 09时52分04秒
************************************************************************/

#include <stdio.h>

int main(int argc,char *argv[])
{
	// 1. 声明变量并初始化
	int age = 21; // 注意:这里的 = 不是我们认知中的等号,在这里叫做赋值符号,意思是将=右边的数据赋值给左边的变量
    
	// 2. 先声明,再赋值
	int count;
	count = 10;
    
	// 3. 初始化和赋值并行
	int number = 12;
	printf("%d\n",number); // 12,%d是十进制int的格式化符
    number = 22;
	printf("%d\n",number); // 22,我们对同一个变量进行赋值的时候,后面赋的值会覆盖掉前面赋的值
	return 0;
}

基本类型,我们创建变量的同时在内存中开辟对应的内存空间。

命名规则
  • 变量名必须以字母(a~z)、下划线(_)开头,后面可以跟着若干个字母、数字、下划线。举例:_int,number,num1

  • 变量名不能与C语言中已经存在的标识符(如:int,float,if,break等)重名。

  • 变量名、变量值、变量所占存储单元之间的关系:

    在这里插入图片描述

标识符
  • 定义:用来表示对象的名字的有效字符。对象包括变量、常量、函数、数组、构造类型等。也就是标识符就是对象的名字。

  • 构成:

    • C语言规定标识符只能由字母、数字、下划线3种字符组成。且第一个必须为字母或者下划线。举例:number,_int

    • 编译系统对大小写敏感。变量名和函数名一般用小写字母+下划线,常量名和枚举名一般用大写字母+下换线。

      举例:变量(set_count)函数(set_count())常量(SET_COUNT)

    • C语言中有3类标识符

      • 关键字:32个,系统有特定的含义和用途,如:float,int,if,else等,不能用作定义标识符(变量和函数)
      • 系统预定义的标识符:如系统提供的库函数名sim,printf,main,scanf以及预处理指令include,define等。
      • 用户标识符:用户定义的标识符,用来给程序的变量、自定义函数、符号常量、数组、构造类型、文件等命名。

    小贴士:

    在C语言中,要求对所用到的变量使用前必须强制定义,即先定义,后使用。

    • C语言中的32个关键字,不允许用户用来定义标识符。

      auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
      
    • C语言中的12个预处理指令。

      #define #endif #elif #error #line #include #ifdef #ifndef #pragma #undef #if #else
      
说明
  • 一个类型说明语句可以同时定义多个类型的变量,各个变量之间使用逗号分隔,多个同类型的变量也可以用多个类型说明语句定义:

    // 写法一:一个类型说明语句可以同时定义多个类型的变量
    int a,b,c,d; // 定义多个同类型的变量,这是一种简略写法
    int a1 = 3,b1 = 4,c1 = 5,d1 = 6;
    
    // 写法二:多个同类型的变量也可以用多个类型说明语句
    int aa;
    int bb;
    int cc;
    int dd;
    int aa1 = 3;
    int bb1 = 4;
    int cc1 = 5;
    int dd1 = 6;
    
  • 用类型说明语句定义的变量只是说明了为这些变量分配了存空间,以便于存放与之相同类型的数据,在未对这些变量赋值前,这些变量中的值是随机的;

  • C语言允许在定义变量的同时为变量赋初始值。

  • 在为长整型变量初始化或者赋值时,如果被赋值的数据为基本整型常量,则C编译系统自动将被赋值数据转换成与相应变量类型一致。

    long a = 12; //左边是long类型变量,右边是int类型的常量,当完成赋值操作后,右边的12的类型被转换为long
    
  • 由于各种整型变量所占的字节数有限,因此,他们所能存储的整数有一定的范围。

    举例:char:1个字节,存储范围:-128~127

基本类型数据

整形数据

用来存放整形数据的变量

我们定义一个整型的变量,C编译系统实际是在内存中分配了能够存储一个整形数据的存储空间,并用变量名来标识这个空间,对该空间的使用也就可以通过变量名来访问。

若不知道你所使用的C编译系统对变量分配空间的大小,可用sizeof运算符查询:如:

printf("%d,%d,%d\n",sizeof int,sizeof(short),sizeof(long)); // 4字节,2字节,8字节

案例:

整型变量的定义和使用

/*************************************************************************
> File Name: demo02.c
> Author: FPF
> Description: 整型数据
> Created Time: 2025年01月21日 星期二 14时34分24秒
************************************************************************/

#include <stdio.h>

int main(int argc,char *argv[])
{
	int a,b,c,d; // 定义有符号整型变量,可以存正数+负数+0,默认就是有符号 等价于:signed inta,b,c,d;
	unsigned int u; // 定义无符号整型变量,只能存正数+0,正数的范围会变大,举例 char a =-128~127,unsigned char u = 0~255
    
	a = 12;
	b = -24;
	u = 10;
	c = a+u,d = b+u;
	printf("a+u=%d,b+u=%d\n",c,d);// a+u=22,b+u=-14; 5-3:在计算机中表示为:5+(-3)
	return 0;
}
整形数据在内存中的存储形式
  • 数据在内存中是以二进制的形式存放

    如果有以下语句

    short i;   // 定义i为存储的整型变量
    i = 10// 给i赋整数10为值
    

    则十进制数10的二进制形式为1010,则内存中实际的存储形式为:

    在这里插入图片描述

  • 实际上:数据在内存中是以补码的形式表示的。

    • 正数的补码和原码(该数的二进制形式)相同

    • 负数的补码是将该数绝对值的二进制形式,按位取反+1(反码+1变补码)

      在这里插入图片描述

浮点型数据

概念:用来表达实数(小数)的数据类型。

浮点型变量的分类
  • 单精度浮点型(float):在64位系统中典型尺寸是4字节,精确到小数点后6位,格式化符%f
  • 双精度浮点型(double):在64位系统中典型尺寸是8字节,精确到小数点后15~16位,格式化符%lf
  • 长双精度浮点型(long double):在64位系统中典型尺寸是16字节。

注意:占用内存越多,能表达的精确度越高

float f1;       // 单精度
double f2;      // 双精度
long double f3; // 长双精度
浮点型数据在内存中的存放形式

浮点型数据在内存中按照指数形式存放。系统将一个浮点数分成小数部分指数部分,分别存放。

1234.5—> 1.2345 ∗ 1 0 3 1.2345*10^3 1.2345103–>1.2345e3

类别符号位指数位小数部分指数偏移量
单精度浮点数1位[31]8位[30~23]23位[22~00]127
双精度浮点数1位[63]11位[62~52]52位[51~00]1023

在这里插入图片描述

案例
  • 要求:写出27.5在内存中存放形式
  • 解析:
    • 27.5的二进制为11011.1
    • 指数表示法: 1.10111 ∗ 2 4 1.10111*2^4 1.1011124
    • 指数:4,加上127,就是131,二进制:1000 0011
    • 尾数:(小数位,小数点后的数):10111,补够23位:1011 1000 0000 0000 0000 000
    • 用二进制表示就是(符号位1为)0(指数位8位)1000 0011(尾数位23位)1011 1000 0000 0000 0000 000

科学计数法**(指数法**):

C语言中一般浮点数有两种表示形式:

  • 十进制形式:指的是数字必须以整数形式+小数形式组成,比如 10.0 、3.14 …符合规则,以10为底数,并且科学计数法要在范围值之内。

  • 指数形式:一般数学上对于小数可以以10为底进行表示 比如3.14 * 10²,但是在使用英文半角输入法的时候没办法输入上底或者下底,所以C语言规定以字母e或者E来表示指数,并且要求字母e或者E的前面必须有数字,字母e或者E的后面必须为整数。 -3.14E-2 2E-3 0.3E4

    printf("%e", 10000000.00);
    

    所以:E3 错误 因为E的前面有数据 比如说 3.14E3

    ​ 3.1e5.6 错误 因为 E的后面必须是整数

    ​ 3.1e-2 对的 相当于 3.1 ∗ 1 0 − 2 3.1*10^-2 3.1102

    ​ 1.01.5e-5 等价于 1.01 ∗ 1 0 − 5 1.01*10^-5 1.01105

字符型数据

概念:字符型变量用来存放字符常量。

定义:

char 变量列表;

范例:

/*************************************************************************
> File Name: demo03.c
> Author: FPF
> Description: 字符型数据
> Created Time: 2025年01月21日 星期二 16时05分09秒
************************************************************************/

#include <stdio.h>

int main(int argc,char *argv[])
{
	char c1,c2;
	c1 = 'A';
	c2 = 'B';
    
	printf("c1=%c\n",c1);// c1 = A,输出的是字符本身
	printf("c2=%c\n",c2);// c2 = B,输出的是字符本身
	printf("c1=%d\n",c1);// c1 = 65,输出的是字符对应的ASCII码
	printf("c2=%d\n",c2);// c2 = 66,输出的是字符对应的ASCII码
	return 0;
}

说明:一个字符变量只能粗放一个字符。C编译系统规定以一个字节的存储空间来存放一个字符,因此,一个字符型变量在内存中的大小是1字节。

字符数据在内存中的存储形式

将一个字符常量存入一个字符变量,实际上并不是把该字符本身存入内存单元中,而是将该字符对应的ASCII码存入内存单元。

例如:

char c1 = 'a',c2 = 'b'

分析:

'a’的ASCII码为97,'b’的ASCII码为98,他们在内存中的存放形式:

在这里插入图片描述

进一步理解,实际上是按照二进制形式存放,形式为:

在这里插入图片描述

由此可见 ,在内存中字符数据的存储形式与整型数据类似,这就使得字符型数据和整型数据之间可以通用,也就是1个字符数据既可以以字符形式输出,也可以以整数形式输出。

  • 以字符形式输出时,编译系统将内存单元中的ASCII码转换为相应的字符,然后输出。
  • 以整型输出时,直接将ASCII码作为整数输出。
  • 因此,可以对字符数据进行算术运算,这时相当于对其ASCII码进行算术运算。
案例
  • 要求:给字符变量赋整数值

    /*************************************************************************
    > File Name: demo03.c
    > Author: FPF
    > Description: 字符型数据
    > Created Time: 2025年01月21日 星期二 16时05分09秒
    ************************************************************************/
    
    #include <stdio.h>
    
    int main(int argc,char *argv[])
    {
    	char c1,c2;
    	c1 = 97;
    	c2 = 98;
        
    	printf("%c %c \n",c1,c2);// a b, 以字符形式输出
    	printf("%d %d \n",c1,c2);// 97 98, 以整数形式输出
        
    	return 0;
    }
    

    说明:char类型可以赋值为字符,也可以赋值为整数 (char a = 888888888; 显示的结果范围:-128~127)

c1在内存的存储形式以及不同形式的输出,如下图所示:

在这里插入图片描述

案例
  • 要求:大小写字母转换

    /*************************************************************************
    > File Name: demo04.c
    > Author: FPF
    > Description: 大小写字母转换
    > Created Time: 2025年01月21日 星期二 16时36分34秒
    ************************************************************************/
    
    #include <stdio.h>
    
    int main(int argc,char *argv[])
    {
    	char c1,c2;
    	c1 = 'm';
    	c2 = 'Y';
        
    	printf("转换前:%c %c \n",c1,c2);
    	// 转换
    	c1 = c1 - 32; // 赋值运算,运算规则:从右到左
    	c2 = c2 + 32;
        
    	printf("转换后:%c %c \n",c1,c2);
        
    	return 0;
    }
    

    注意:C语言允许字符数据与整数直接进行算术运算,可以相互赋值。每一个英文小写字母比它相应的大写字母的ASCII大32。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值