Day 2
变量
概念
定义:在程序运行过程中可变的量
- 变量代表内存中具有特定属性的一个存储单元,用来存储数据即变量的值
- 变量要有名字,便于访问变量
格式
数据类型 变量名列表
举例:
#include <stdio.h>
int main(int argc,char *argv[])
{
/*声明变量并初始化
解释:向内存申请一块存储空间,并给这个空间添加一个初始数据
命名:变量名就是标识符的一种,命名规则:以字母或下划线开头,只能包含数字、字母、下划线
演示的变量命名: _int,num2*/
int age = 21; //注意=是赋值运算符,意思是将右边的21赋值给左边的变量
//2.先声明,再赋值
int count;
count = 10;
//3.初始化和复制并行
int number = 12;
printf("%d\n",number);
number = 22;
printf("%d\n",number);
//4可以为多个变量定义同一类型,多个变量之间用逗号隔开
int a,b = 10,c; //此时定义了3个变量,只有b初始化了
//访问未初始化变量
//未初始化变量一般由系统分配
printf("%d %d %d\n",a,b,c);
return 0;
}
运行结果:
命名规范
-
以字母或者下划线开头,后面跟数字、字母、下划线
-
不能与关键字(if,int)或预定义的标识符(printf,main)重名
标识符
定义:用来表示对象名字的有效标识符。对象包括变量、常量、函数、构造类型等。也就是标识符是这些对象的名字。
构成:
-
C语言规定的标识符只能由字母、数字、下划线三种字符构成。且只能以下划线或者字母开头。
-
编译系统对字母的大小写敏感。变量名和函数一般用小写字母+下划线
set_count ;//变量steCount可以但不推荐
set_count(); //函数steCount()可以但不推荐
SET_COUNT; //常量、枚举
C语言中3类标识符
-
关键字: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
-
系统预定义的标识符:如系统提供的函数名sim,printf,main,scanf等以及预处理指令include,define等。
C语言中有12个预处理指令:
define endif elif error line include ifdef ifnodef pargma undef if else
注意:以上预处理指令使用的时候,在前面需添加#
,如#include
-
用户标识符:用户定义的标识符,用来给变量、自定义函数、符号常量、数组、构造类型、文件等命名。
注意:在C语言中要求对所用到的变量,在使用前必须强制定义。先定义,后使用
使用
-
一个类型说明语句可以同时定义多个变量,各变量之间用逗号分隔,多个同类型的变量也可以用多个类型说明语句定义:
//写法一:一个类型说明语句同时定义多个变量
//优点:简洁
//缺点:可读性差
int a,b,c,d;
int al=3,bl=4,cl=5,dl=6;
//写法二:
//优点:可读性强
//缺点:繁琐
int aa;
int bb;
int cc;
int dd;
int al=3;
int bl-4;
int cl=5;
int dl=6;
同类型说明语句定义的变量只是为这些变量分配了内存空间。以便以存放与之相同类型的数据。在未对这些变量赋值前,这些变量中的值是随机的(具体的随机由内存状态来决定),在C标准中访问未初始化的变量是“未定义行为(UB)
#include <stdio.h>
int main(int argc,char *argv[])
{
int a,b,c,d;
printf("%d %d %d %d\n",a,b,c,d);
return 0;
}
//第一次运行的值-661421152 32764 0 0
//第二次运行的值-53248064 32764 0 0
-
C语言允许定义变量的同时为变量赋初始值。
-
在为长整型变量初始化或者赋值时,如果被赋值的数据为基本整型常量,则C编译系统自动将被赋值数据转换为与之相依变量类型一致的数据。
-
由于各种整型变量所占字节数有限,因此,它们存储的的整数有一定的范围
举例:
unsigned char a
:1个字节,存储范围:0~255;char b
:1个字节,存储范围:-128~127
提示:
unsigned是无符号数标识,没有则默认为有符号数
基本类型数据
整型数据
用来存放整型数据的变量
定义一个整型变量,C编译系统从内存中分配了一块相应的存储空间,并用变量名来表示这个空间。通过变量名访问改空间。
其大小用sizeof查询
int a = 10;
printf("%d %d\n",sizeof(int),sizeof(a));
整型数据在内存中的存储形式
数据在内存中是以二进制形式存放
整型数据在内存中是以补码形式存在,使用补码是为了统一加减法 我们程序中直接转出来的二进制是原码形式
-
正数的补码和原码(二进制)相同,(反码是原码和补码转换的过程产物)三码唯一
-
负数的补码是将该绝对值的二进制形式针对数据位取反+1
内存数据的读写:
①向内存存数据(二进制):程序原始数据→二进制源码 →二进制反码→ 二进制补码
②从内存读数据(二进制):二进制补码 → 二进制反码 →二进制源码 →程序原始数据
#include <stdio.h>
int main(int argc,char *argv[])
{
//定义有符号整型变量,可以存放正数、0、负数,默认就是有符号数
int a,b,c,d; //等价于signed int a,b,c,d;
//定义无符号整型变量,可以存放正数、0,不能存放负数,必须添加unsigned
unsigned int u;
//赋值
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
//计算器支持加法运算,不支持减法运算
return 0;
}
运行结果
浮点型数据
定义:用来表达实数(小数)的数据类型
浮点型变量的分类
-
单精度浮点(float):在64位系统中尺寸是4字节,精确到小数位6位,格式化符号%f
-
双精度浮点型(double):在64位系统中尺寸是8字节,精确到小数位15~16位,格式化符号%lf
-
长双精度浮点型(long double):在Linux下64位尺寸是16字节。
注意:占用内存越多,能表示的精确度越高
float f1 = 12.25f; //单精度
double f2 = 12.5; //双精度
long double f3; //长双精度
浮点型数据在内存中的存储形式
浮点型数据在内存中以指数形式存放。系统将一个浮点型数分成尾数部分和指数部分,分别存放。
类别 | 字节数 | 符号位 | 指数位 | 尾数位 | 指数偏移 |
单精度浮点数 | 4 | 1位[31] | 8位[30~23] | 23位[22~00] | 127 |
双精度浮点数 | 8 | 1位[63] | 11位[62~52] | 52位[51~00] | 1023 |
举例:
写出-125.625在内存中的存放形式
解答:
- -125.625的二进制为-1111101.101
- 转为指数形式-1.111101101*2^6 (注意:二进制所以是2^n)
- 指数+指数偏移6+127=133,转为二进制1000 0101(小数点前,若不够八位,前面添0大小不变)
- 尾数111101101(小数点后,若不够23位,后面添0大小不变)
- 结果为1100 0010 1111 1011 0100 0000 0000 0000
符号位 | 指数位 | 尾数位 |
1 | 1000 0101 | 1111 0110 1000 0000 0000 000 |
小数化二进制:整数部分除2取余,小数部分乘二取整。
① 整数部分:采用辗转除2直到出现小数为止。
② 小数部分:采用辗转乘2直到整数位出现1,小数位出现0为止,但是有时候会出现乘不尽的情况,此时需根据内存大小来决定保留位数。
字符型数据
字符型数据
概念:字符型变量用来存放字符常量
定义:
char 变量列表;
举例:
#include <stdio.h>
int main(int argc,char *argv[])
{
char c1,c2;
c1 = 'A';
c2 = 'B';
printf("c1=%c\n",c1); //%c是字符的格式化符号
printf("c2=%c\n",c2);
printf("c1=%d\n",c1);
printf("c2=%d\n",c2);
return 0;
}
运行结果:
字符数据在内存中的存储形式
将一个字符常量存入一个字符变量,实际上并不是把该字符本身存入内存中,而是将该字符对应的ASCII码存入内存单元
-
以字符形式输出时,编译系统将内存单元中的ASCII码转换为相应的字符,然后输出。
-
以整型输出时,直接将ASCII码作为整数输出。
-
因此,可以对字符数据进行算数运算,这时相当于对其ASCII码进行算数运算。
案例
要求:给字符变量赋整数值
#include <stdio.h>
int main(int argc,char *argv[])
{
char c1,c2;
c1 = 68;// char既能赋值字符,也能赋值整数(ASCII码)
c2 = 99;
printf("%c %c \n",c1,c2);// a b, 以字符形式输出
printf("%d %d \n",c1,c2);// 97 98, 以整数形式输出
return 0;
}
说明:char类型可以赋值为字符,也可以赋值为整数(char a = 128,显示的结果范围:-128~127),演示案例:
#include <stdio.h>
int main(int argc,char *argv[])
{
char c1;
c1=130;
printf("%d\n",c1);
return 0;
}
运行结果:
讲解:
可以将char的取值范围比作一个钟表,当取值超出范围,进入下一轮循环
案例
-
需求:大小写字母转换
-
代码:
#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;
}
运行结果: