变量和基本数据类型
变量类型的概念
变量是在程序中可以发生变化的量,变量是有类型的,变量的类型决定了变量存储空间的大小以及如何解释存储的位模式。
1字节(Byte)=8位(bit)
定义格式
存储类型 数据类型 变量名;
例如:
(auto) int a;
存储类型:
auto、static、register、extern
变量名:
是标识符,要遵循标识符命名规则
数据类型:
包含名称、大小(单位字节)和取值范围
char、short、int、long、float、double、signed、unsigned
类型 | 存储大小 | 值范围 | |
char | 字符类型 | 1字节 | -2^7 ~ 2^7-1 |
unsigned char | 无符号字符类型 | 1字节 | 0 ~ 2^8-1 |
int | 整数类型 | 4字节 | -2^31 ~ 2^31-1 |
unsigned int | 无符号整数类型 | 4字节 | 0 ~ 2^32-1 |
short | 短整型 | 2字节 | -2^15 ~ 2^15-1 |
unsigned short | 无符号短整型 | 2字节 | 0 ~ 2^16-1 |
long | 长整型 | 4字节 | -2^31 ~ 2^31-1 |
unsigned long | 无符号长整型 | 4字节 | 0 ~ 2^32-1 |
float | 单精度浮点型 | 4字节 | 有效数据到小数点后6~7位 |
double | 双精度浮点型 | 8字节 | 有效数据到小数点后15~16位 |
例如:
int c=10,d=10; float a=33.33333333; double b=33.33333333; printf("%f\n%lf\n%d %d\n",a,b,c,d);
输出结果为:
33.333332
33.333333
10 20
初始化格式
定义时初始化
int a=10;
先定义再初始化
int a;
a=10;
局部变量和全局变量
相关概念
生命周期
变量的生命周期是指变量从创建到销毁之间的一个时间段,也就是存活的周期,是时间维度。
作用域
作用域是指变量可以起作用的范围,是空间维度。
内存分区
全局变量和局部变量的区别:
局部变量 全局变量 定义位置 函数体内部 函数体外部 存储位置 栈区 全局区 生命周期 同函数体共存亡 同整个程序共存亡 作用域 作用于函数体内部 作用于整个程序 初值 未初始化时是随机值 未初始化时是0 #include <stdio.h> #include <stdlib.h> int n1; int mai(int args,char const *argv[]) { int nn2; printf("%d %d\n",n1,n2); return 0; }
输出结果为:
0 7153974
常量
概念
程序运行过程中不会发生改变的量叫做常量,常量存放在常量区。
分类
字符型常量
字符型常量属于char类型,从ASCII码表里面能找到的都是字符型常量,用单引号括起来表示,不可以改变,例如:‘A’ 。
类型 | 存储大小 | 值范围 | |
char | 字符类型 | 1字节 | -128 ~ 127 |
unsigned char | 无符号字符类型 | 1字节 | 0 ~ 255 |
signed char | 有符号字符类型 | 1字节 | -128 ~ 127 |
原码、补码和反码
最高位表示符号位,正数是0,负数是1
正数的原码、补码、反码都一样
负数要用补码来计算:
原码:在数值前面直接加符号位表示
反码:符号位不变,其他位按原码取反
补码:反码加一
例如:
-5:
原码:1000 0101
反码:1111 1010
补码:1111 1011
用‘’(单引号)括起来的就是字符型常量:
‘a’ 字符a
‘\0’ 空字符
‘\n’ 换行符
例如:
char c='a';//把字符常量a赋值给字符型变量 printf("%c\n",'A'); printf("%c\n",66); printf("%c\n",'\x42');//十六进制的ASCII码值表现形式 printf("%c\n",'\102');//八进制的ASCII码值表现形式 printf("%c\n",c); printf("%c\n",'A'+32); printf("%c\n",'A'+' '); printf("%c\n",'A'+1);
补充:
在C语言中规定转义字符 ‘\x41’ 中的 \ 是转义字符引导符,后面跟一个x,表示x后面的数字是十六进制表示法,用 ‘’(单引号)括起来表示字节ASCII码值。转义字符 \ 后面直接加数字表示转义字符后面的数字是八进制表示法,代表转义成八进制的字符。
字符串常量
用 “”(双引号)括起来的就是字符串,字符串后面会自动加上一个 ‘\0’ ,表示字符串结束 。
例如:
“hello” 字符串结尾有一个 ‘\0’
printf("hello\n");
printf("%s","hello");
整型常量
整型常量是类型为整数的常量,包括从负数到零到正数所有的整数,可以用二进制、八进制、十进制、十六进制表示。
例如:
int a=15;//把整数常量赋值给整数变量 printf("%d\n",a); printf("%d\n",0b1111);//二进制输出15 printf("%d\n",017);//八进制输出15 printf("%d\n",15);//十进制输出15 printf("%d\n",0xF);//十六进制输出15
以上输出的结果都是15
浮点型常量
浮点型常量就是为浮点数的常量,包括从负数到零到正数所有的浮点数。
数据类型有float和double。
指数常量
指数常量就是用科学计数法表示的常量。
例如:
300000 = 3*10^5 = 3e+5
0.0000002 = 2*10^-7 = 2e-7
标识符常量(宏定义)
宏定义:起标识符的作用
单纯的文本替换,在预处理的时候进行。
必须遵循标识符的命名规则。
一般大写标识。
格式:#define 宏名 常量或表达式
特点:只能单纯的文本替换,不要进行手动运算,(原样替换,替换完再进行计算)。
#include <stdio.h>
#include <stdlib.h>
#define ONE
#define TWO ONE+ONE
#define MORE TWO+ONE+ONE+ONE+ONE+ONE+ONE
#define HELLO "Hello"
int main(int argc,char const *argv[])
{
printf("%d\n",MORE);
printf("%s\n",HELLO);
}
如果一个串长于一行,可在行尾用反斜杠 ‘\’ 进行续行
#define N 2
#define M N+3 //2+3
#define NUM N+M/2+1 //2+2+3/2+1 = 6
void main()
{
int a=NUM;
printf("%d\n",a); //6
}