C语言学习笔记之 变量与常量
CPU寄存器、内存、硬盘间的关系
CPU寄存器与内存的关系
CPU寄存器、内存、硬盘间的关系
内存的最小存储单位
一个二进制位,只能存放0或1(内存最小存储单位)
1b = 一个二进制位
8个位 = 一个字节(内存计量的最小单位)
8 b = 1 B
1024 B = 1 KB
1024 KB = 1 MB
1024 MB = 1 GB
1024 GB = 1 TB
C语言数据类型
基本数据类型
类型是抽象的概念,有大小,没有空间,
系统不会给类型分配空间,只给类型定义的变量分配空间
- char 字符型
- short 短整型
- int 整型
- long 长整形
- long long 超长整型(C99)
- float 单精度浮点型
- double 双精度浮点型
获取类型大小
sizeof()
#include <stdio.h>
int main() {
printf("char:%d\n", sizeof(char));
printf("short:%d\n", sizeof(short));
printf("int:%d\n", sizeof(int));
printf("long:%d\n", sizeof(long));
printf("long long:%d\n", sizeof(long long));
printf("float:%d\n", sizeof(float));
printf("double:%d\n", sizeof(double));
return 0;
}
VS x86运行结果(单位:字节):
char:1
short:2
int:4
long:4
long long:8
float:4
double:8
VS x64运行结果:
char:1
short:2
int:4
long:4
long long:8
float:4
double:8
Ubuntu运行结果:
char:1
short:2
int:4
long:8
long long:8
float:4
double:8
数据类型的大小和操作系统有关
C标准只要求sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)
有符号与无符号
符号位
计算机存储数据时,会将第一个二进制位作为符号位,符号位是0表示正数,1表示负数,
其中负数是用其绝对值的补码来表示的
有符号与无符号整型
- 有符号整型
// 下面的两个声明语句是等效的 int a; signed int a; // 有符号整型
包括符号位,此时32位中有一位是符号位,
因此存储范围是-2147483647~2147483647(以4字节为标准) - 无符号整型
unsigned int a; // 无符号整型
不包括符号位,此时32位全部用于存储数据
存储范围:0~4294967295(以4字节为标准)
布尔类型
头文件:stdbool.h
定义:
_Bool flag = true; // 定义一个布尔类型,初始化为真
_Bool flag = false; // 初始化为假
例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
int main() {
_Bool flag = true;
int n;
printf(">");
scanf("%d",&n);
getchar();
flag = (n > 0);
if (flag) {
printf("true\n");
}
else {
printf("false\n");
}
printf("flag = %d", flag);
return 0;
}
运行结果:
>547
true
flag = 1
>-243
false
flag = 0
其他数据类型
- enum 枚举类型
- void 空类型
- 派生类型
- 指针类型(*)
- 数组类型([ ])
- 结构体类型(struct)
- 共用体类型(union)
- 函数类型
变量与常量
常量(字面常量)
常量在程序运行期间其值不能被修改
整型常量
如 10,12345,-10等
实型常量
如123.13,-13.233,12.34e3(12.34 × 10³)
字符常量
普通字符
如'a','b','Z','#'
转义字符
如'\n','\''
转义字符 | 含义 |
---|---|
\' | 一个单撇号(') |
\" | 一个双撇号(") |
\? | 一个问号(?) |
\\ | 一个反斜杠(\) |
\a | 警告(alert),产生声音或视觉信号 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车,将当前位置移到本行的开头 |
\t | 水平制表符,相当于按Tab键 |
\v | 垂直制表符,将当前位置移到下一个垂直制表对齐点 |
\o、\oo或\ooo,其中o代表一个八进制数字 | 与该八进制码对应的ASCII字符 |
\xh[h...],其中h代表一个十六进制数字 | 与该十六进制数字对应的ASCII字符 |
字符串常量
如"abc","你好"
符号常量
用#define指令,指定用一个符号代表一个常量
#define PI 3.14
变量
变量在程序运行过程中,其值可以被修改
系统会给变量按数据类型开辟一块内存空间
变量必须先定义,后使用
变量的定义
类型名 变量名;
例:
int a; // 定义一个整型变量a,给它分配4字节
变量名本质是存放变量的内存空间的内容的别名
对变量的处理,实际上是通过变量名找到对应的内存地址,对该存储单元中的数据进行处理
变量的命名规则
以数字、字母、下划线组成,不能用数字开头
变量的初始化
int a = 0;
int b;
// do something
b = 0; // 这不是初始化,而是赋值
变量可以直接初始化,也可以先定义再赋值
建议在定义变量后尽快初始化,避免出错(尤其是后面的指针)
变量的声明
显示声明
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
extern int data; // 显示声明,告诉编译器data存在
// extern int data = 0; //error ,声明时不要给变量赋值
int main() {
printf("data = %d", data);
return 0;
}
int data = 0; // 初始化data
隐式声明
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int data = 0;
printf("data = %d", data); // 隐式声明
return 0;
}
常变量
C99 允许使用常变量,如:
const int a; // 常变量在运行期间其值不能改变
注意!常变量必须初始化
当你想直接修改常变量的值时,就会报错:
const int a = 0;
a = 1; // 报错
常变量和符号常量的区别在于,常变量占用内存,而符号常量是无脑替换,不占用内存
但实际上,常变量可以通过指针来修改:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
const int a = 0;
int *p;
p = &a;
printf("a = %d\n", a);
*p = 1;
printf("a = %d\n", a);
return 0;
}
运行结果:
a = 0
a = 1
左值与右值
左值
左值是用来指明一个对象的表达式,最简单的左值就是变量(lvalue)
右值
除了左值以外的表达式就是右值(rvalue)