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)

posted @ 2020-08-31 10:58  小宇宙zjy  阅读(315)  评论(0编辑  收藏  举报