变量相关概念回顾:
回顾内存RAM功能和特点:
1.字节(byte):计算机将内存分成一格一格,每一格用来存储一个数字,每一格对应的专业术语叫字节。
2.地址(address):计算机给内存的每个字节都指定一个唯一编号,编号从0开始,后续字节编号依次+1
3.存储区(buffer):计算机将1字节或者多个连续的字节形成一个存储单元简称存储区,又称缓冲区
4.首地址(base address):又称起始地址,存储区中的第一个字节的地址用来当存储区的首地址,又称基地址
5.原则:任何程序访问内存前先分配(操作系统负责分配)
1GB = 1024MB = 1024*1024KB = 1024*1024*1024B(Byte)
常量与变量:
在程序执行过程中,其值不发生改变的量称为常量
-直接常量(字面值)
整型量:10, 10u, 10L, 10LL, 0X12, 0XA
实型量:0.12, 0.12F, 1.2E-1
字符型:'A', '\n'
字符串:”Hello,world\n‘ (字符串是常量)
-标识符
标识变量名、数组名、函数名、类型名的有效字符序列
-符号常量
符号化的常量,如宏定义,枚举元素等
在程序执行过程中,其值可以改变的量称为变量
-定义变量(第一种内存分配方式)
数据类型 变量名 = 初始值;
int a = 233;
本质:分配4字节内存并储存233,内存打个标签叫a
-变量名必须是合法的标识符(变量名或者函数名)
字母或下划线开头,不能是数字开头
Int var = 233; int _var =222; int 2var = 233;(X)
-包含字母、下划线和数字
-不能与关键字冲突
int int = 233;
-大小写敏感
int VAR = 233;
C语言的编程风格
单条语句可写在任意多行内
int main(void) {printf("hello world"); return 0;}
必要的空格令代码更加清晰
严格的缩进令代码层次分明
适度的空行划分出逻辑单元
统一用驼峰或者下划线命名
int nAge = 19; //单峰
int CreateWindows = 233; // 双峰
int create_windows = 233; // 下划线
基本数据类型
数据类型功能:gcc预算将来分配内存大小
关键字 | 含义 | 分配内存 | 值域 | 标记符 |
char | 字符类型(1字节整数) | 1字节 | -123~127 | %c |
unsigned char | 非负1字节整型 | 1字节 | 0~255 | 会被提升为%d或者%u |
short | 2字节整型 | 2字节 | -32768~32767 | %hd |
unsigned short | 非负2字节整型 | 2字节 | 0~65535 | %hu |
int | 4字节整型 | 4字节 | -2^31~2^31-1 | %d |
unsigned int | 非负4字节整型 | 4字节 | 0~2^32-1 | %u |
long | 4(32位)/8(64位) 整型 | 4/8字节 | 2^31/63~2^31/63-1 | %ld |
unsigned long | 非负4/8字节整型 | 4/8字节 | 0~2^32/64-1 | %lu |
long long | 8字节整型 | 8字节 | -2^63~2^63-1 | %lld |
unsigned long long | 非负8字节整型 | 8字节 | 0~2^64-1 | %llu |
float | 单精度浮点数 | 4字节 | +-[1.2*10^38~3.4^10^38] | %f/%g |
double | 双精度浮点数 | 8字节 | +-[2.2*10^308~1.8*10^308] | %lf/%lg |
lf:3.140000 | 会自动补零 | lg: 3.14 | 不会自动补零 |
计算数据类型大小
sizeof(参数)
1.计算内存的大小,以字节为单位
2.参数可以是类型、变量或表达式
sizeof(a),sizeof(int),size(a+1)
3.不计算参数的值,只关注其类型
4.赋值作为无效处理
sizeof的计算结果类型是一个unsigned long类型,标记符用 %lu
提问:
char b=1,c=2;
printf("sizeof(b+c)=%lu\n",sizeof(b+c)) 为何输出为4?
答: 隐式类型转换,%lu将char强转为int类型了
隐式类型转换:gcc自动转换,先转换后运算,小转大,整转浮,有符号转无符号
printf(1?1:0.9); 0.9默认double类型,强转为double类型
细说字符类型(基本数据类型)
字符常量 字符常量不可更改
用单引号括起来表示,例如:'A'
本质内存存储的是一个整数,即字符的ASCII码
字符常量 ’A‘ 对应的整数时65
’ d‘ - 'a' = 本质是100 -97 =3
char c = 'A';
printf("c = %c\n", c); //按照字符形式打印输出 A
printf("c = %hhd", c); //按照ASCII码整型数形式输出 65
c = c + 1; %c B %hhd 66
c = 67; %c C %hhd 67
字符变量
char/unsigned char
分配一字节
printf/scanf格式化占位符:%c或者%hhd
char e = '22'; 字符常量,且是无效字符
这里解释一下scanf工作原理:
输入22时,scanf("%c",&c);会取一个字符,即取走2,此时scanf的buff区还有 一个2,会放入下一次的输入中。
其中,scanf("%*c");会自动读取一个字符,被用来做清除使用
char e = 10; 是char类型,是以ASCII码作为值赋给变量,即字符变量
char e = "10" 字符串
转义字符:
转义练习代码如下:
#include <stdio.h>
int main(void){
printf("hello\n"); //hello
printf("1234\rabc\n"); //abc \r回到行首,先输出1234,而后被abc覆盖掉,即只打印abc
printf("%d\t%d\n", 100, 200); //100 200
printf("%d\t%d\n", 300, 400); //300
// 400
printf("hello\bworld\n"); //hellworld 覆盖o
printf("hello\\world\n"); //hello\world
printf("\'hello\'\n"); //'hello'
printf("\"hello\"\n"); //"hello"
printf("100%%\n"); //100%
return 0;
}
练习:
1.把数字字符转换为整数:’5‘ -> 5
#include <stdio.h>
int main(void){
char c = '5';
int b = '5' - '0';
printf("%d\n",b);
return 0;
}
2.把小写字母转换为大写字母 ’a‘ -> 'A'
'a' 97 'A' 65 97-65 = 32
'b' 98 b-32 = B
char c1 = 'B';
char c2 = 'b';
char c3 = 'a';
char c4 = c3 - (c2-c1);
printf("%c\n",c4);
整型类型 浮点类型:
整型类型:
[signed/unsigned] short/int/long/long long
-字面值前缀:
无:十进制,例如:520
0:八进制。例如:0520
0x:十六进制,例如:0x520
-字面值后缀[核心,用于数据类型转换]
无:int, 例如:100
U/u:unsigned int, 例如:100U/100u
L/l:long,例如:100L/100l
LL/ll:long long, 例如:100LL/100ll
UL/ul:unsigned long,例如:100UL/100ul
浮点类型:
float/double
-字面值后缀
无:double,如1.23
F/f:float,例如:1.23F/1.23f