# 常量与变量
# 关键字
C的关键字共有32个
- 数据类型关键字:char、short、int、long、float、double、signed、unsigned、void、struct、union、enum
- 控制语句关键字:if、else、switch、case、default、for、do、while、break、continue、goto、return
- 存储类型关键字:auto、register、static、extern、typedef
- 其他关键字:const、sizeof、volatile
# 数据类型
数据类型的作用:告诉编译器,变量或函数应该如何使用,分配多大的内存,以及如何解释内存中的位模式。
# 常量
在程序运行中,其值不会发生改变的量称为常量。 常量一般出现在表达式或赋值语句中。
常量类型 | 举例 |
---|---|
整型常量 | 123、-123、0 |
实型常量 | 123.0、-123.0、0.0、1.23e2、-1.23e2、0.0e0 |
字符常量 | 'a'、'A'、'0'、'\n'、'\t'、'''、'\' |
字符串常量 | "abc"、"123"、"a\tb"、"a\nb" |
# 变量
TIP
- 变量是程序运行过程中可以改变的量。
- 变量在使用前必须先定义,即变量的定义必须出现在变量的使用之前。
# 变量命名规则
- 变量名由字母、数字和下划线组成,且第一个字符必须是字母或下划线。
- 变量名中的字母可以是大写或小写,区分大小写。
- 不能使用关键字作为变量名。
- 不能使用空格、制表符和换行符作为变量名。
# 变量特点
- 变量在编译时为其分配内存空间,变量的内存空间在程序运行时才分配。
- 可以通过变量名访问变量的值。
# 声明和定义区别
- 声明变量是不需要分配内存空间的,而定义变量是需要分配内存空间的。
#include <stdio.h>
int main() {
//声明一个变量a,a在这里没有建立存储空间
extern int a;
a = 10; //err, 没有空间,就不可以赋值
int b = 10; //定义一个变量b,b的类型为int,b赋值为10
return 0;
}
int a
它是一个定义,也是一个声明,因为它既分配了内存空间,也说明了变量的类型。extern int a
它是一个声明,因为它没有分配内存空间,只是告诉编译器,这个变量在别的地方已经定义了,你可以在这里使用它。
#include <stdio.h>
#define MAX 100
int main() {
int a; //定义了一个变量,其类型为int,名字叫a
const int b = 10; //定义一个const常量,名为叫b,值为10
//b = 11; //err,常量的值不能改变
//MAX = 100; //err,常量的值不能改变
a = MAX;//将abc的值设置为MAX的值
a = 123;
printf("%d\n", a); //打印变量a的值
return 0;
}
# 整形 int
# 整形变量的定义和输出
打印格式 | 说明 |
---|---|
%d | 以十进制形式输出带符号整数 |
%u | 以十进制形式输出无符号整数 |
%o | 以八进制形式输出无符号整数 |
%x | 以十六进制形式输出无符号整数 |
%X | 以十六进制形式输出无符号整数,字母大写 |
#include <stdio.h>
#define MAX 100
int main() {
int a = 123;//定义一个整型变量a,以十进制形式赋值为123
int b = 0123;//定义一个整型变量b,以八进制形式赋值为0123
int c = 0x123;//定义一个整型变量c,以十六进制形式赋值为0x123
int d = 0b1010;//定义一个整型变量d,以二进制形式赋值为0b1010
printf("a = %d\n", a);
printf("8进制b = %o, \n", b);
printf("16进制c = %x, \n", c);
printf("16进制c = %X, \n", c);
printf("2进制d = %b, \n", d);
return 0;
}
# 整形变量的输入
#include <stdio.h>
int main() {
int a;
printf("请输入一个整数:");
scanf("%d", &a);
printf("a = %d\n", a);
return 0;
}
# short
、 int
、 long
、 long long
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short(短整型) | 2字节 | [-32768, 32767] |
int(整型) | 4字节 | [-2147483648, 2147483647] |
long(长整型) | 4字节 | [-2147483648, 2147483647] |
long long(长长整型) | 8字节 | [-9223372036854775808, 9223372036854775807] |
#include <stdio.h>
int main() {
short a = 32767;
int b = 2147483647;
long c = 2147483647;
long long d = 9223372036854775807;
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %ld\n", c);
printf("d = %lld\n", d);
return 0;
}
WARNING
short
、int
、long
、long long
都是整形,只是占用空间不同。- 当小的数据类型赋值给大的数据类型时,不会有问题。因为编译器会自动进行类型转换。
- 当大的数据类型赋值给小的数据类型时,可能会丢失高位。
# 有符号和无符号
- 有符号:最高位表示符号位,0表示正数,1表示负数。
- 无符号:所有位表示数值,没有符号位。
#include <stdio.h>
int main() {
unsigned int a = 4294967295;
printf("a = %u\n", a);
return 0;
}
数据类型 | 占用空间 | 取值范围 |
---|---|---|
unsigned short(无符号短整型) | 2字节 | [0, 65535] |
unsigned int(无符号整型) | 4字节 | [0, 4294967295] |
unsigned long(无符号长整型) | 4字节 | [0, 4294967295] |
unsigned long long(无符号长长整型) | 8字节 | [0, 18446744073709551615] |
#include <stdio.h>
int main() {
unsigned short a = 65535;
unsigned int b = 4294967295;
unsigned long c = 4294967295;
unsigned long long d = 18446744073709551615;
printf("a = %u\n", a);
printf("b = %u\n", b);
printf("c = %lu\n", c);
printf("d = %llu\n", d);
return 0;
}
# sizeof
关键字
sizeof
是一个单目运算符,用来计算数据类型或变量的字节数。sizeof
的计算结果是size_t
类型,是一个无符号整数。
#include <stdio.h>
int main(){
int a = 10;
printf("int类型占用空间为:%lu\n", sizeof(int));
printf("a变量占用空间为:%lu\n", sizeof(a));
return 0;
}
# 字符型 char
# 字符型变量的定义和输出
字符型变量是用来存储字符的,每个字符占用一个字节的空间。
#include <stdio.h>
int main() {
char a = 'a';
char b = '0';
char c = '\n';
char d = '\t';
char e = '\'';
char f =
printf("a = %c\n", a);
printf("b = %c\n", b);
printf("c = %c\n", c);
printf("d = %c\n", d);
return 0;
}
# 字符型变量的输入
#include <stdio.h>
int main() {
char a;
printf("请输入一个字符:");
scanf("%c", &a);
printf("a = %c\n", a);
return 0;
}
# ASCII码
ASCII码是一个字节的编码,共有128个字符,包括大小写字母、数字、标点符号、控制字符等。
ASCII码 | 字符 | ASCII码 | 字符 | ASCII码 | 字符 | ASCII码 | 字符 |
---|---|---|---|---|---|---|---|
0 | NUL | 32 | SPACE | 64 | @ | 96 | ` |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | ' | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | TAB | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DC1 | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | ETB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | 94 | ^ | 126 | ~ | |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
# 转义字符
转义字符是一些有特殊含义的字符,它们由反斜杠
\
开头。
转义字符 | 含义 | ASCII码值(十进制) |
---|---|---|
\a | 响铃 | 7 |
\b | 退格 | 8 |
\f | 换页 | 12 |
\n | 换行 | 10 |
\r | 回车 | 13 |
\t | 水平制表符 | 9 |
\v | 垂直制表符 | 11 |
\\ | 反斜杠 | 92 |
\' | 单引号 | 39 |
\" | 双引号 | 34 |
\? | 问号 | 63 |
\0 | 空字符 | 0 |
\ddd | 1~3位八进制数所代表的任意字符 | 0~255 |
\xhh | 1~2位十六进制数所代表的任意字符 | 0~255 |
#include <stdio.h>
int main() {
printf("hello world\n");
printf("hello\tworld\n");
printf("hello\bworld\n");
printf("hello\rworld\n");
printf("hello\\world\n");
printf("hello\'world\n");
printf("hello\"world\n");
printf("hello\?world\n");
printf("hello\0world\n");
printf("hello\x41world\n");
printf("hello\x4fworld\n");
return 0;
}
# 实型 float
、 double
实型变量是用来存储实数的,包括小数和整数。C语言中的实型变量包括单精度实型和双精度实型。
- 单精度实型:
float
,占用4个字节,有效位数为6~7位。 - 双精度实型:
double
,占用8个字节,有效位数为15~16位。
#include <stdio.h>
int main() {
float a = 3.14f;
double b = 3.14;
printf("a = %f\n", a);
printf("b = %lf\n", b);
return 0;
}
# 字符串格式化输出和输入
# 字符串常量
- 字符串是内存中一段连续的空间,用来存储字符序列。以
\0
结尾。 - 字符串常量是用双引号括起来的字符序列,例如
"hello world"
。
WARNING
字符串常量与字符常量的区别:
- 字符串常量是用双引号括起来的字符序列,例如
"hello world"
。每个字符串常量都以\0
结尾。 - 字符常量是用单引号括起来的字符,例如
'a'
。
# printf
函数和 putchar
函数
printf
函数:格式化输出函数,可以将格式化的数据输出到屏幕上。putchar
函数:输出一个字符到屏幕上。
格式化输出
打印格式 | 对应数据类型 | 说明 |
---|---|---|
%d | int | 以十进制形式输出带符号整数 |
%u | unsigned int | 以十进制形式输出无符号整数 |
%o | unsigned int | 以八进制形式输出无符号整数 |
%x | unsigned int | 以十六进制形式输出无符号整数 |
%X | unsigned int | 以十六进制形式输出无符号整数,字母大写 |
%f | float | 以小数形式输出单精度实数 |
%lf | double | 以小数形式输出双精度实数 |
%c | char | 输出一个字符 |
%s | char * | 输出一个字符串 |
%% | 无 | 输出一个百分号 |
%p | void * | 输出一个指针的值 |
%e | float 、 double | 以指数形式输出单精度实数、双精度实数 |
%E | float 、 double | 以指数形式输出单精度实数、双精度实数,字母大写 |
%g | float 、 double | 以%f或%e中较短的输出宽度输出单精度实数、双精度实数 |
%G | float 、 double | 以%f或%E中较短的输出宽度输出单精度实数、双精度实数,字母大写 |
%hd | short | 以十进制形式输出带符号短整数 |
%hu | unsigned short | 以十进制形式输出无符号短整数 |
%hx | unsigned short | 以十六进制形式输出无符号短整数 |
%ho | unsigned short | 以八进制形式输出无符号短整数 |
%ld | long | 以十进制形式输出带符号长整数 |
%lu | unsigned long | 以十进制形式输出无符号长整数 |
%lx | unsigned long | 以十六进制形式输出无符号长整数 |
%lo | unsigned long | 以八进制形式输出无符号长整数 |
%lld | long long | 以十进制形式输出带符号长长整数 |
%llu | unsigned long long | 以十进制形式输出无符号长长整数 |
%llx | unsigned long long | 以十六进制形式输出无符号长长整数 |
%llo | unsigned long long | 以八进制形式输出无符号长长整数 |
%Lf | long double | 以小数形式输出长双精度实数 |
%Le | long double | 以指数形式输出长双精度实数 |
%LE | long double | 以指数形式输出长双精度实数,字母大写 |
%Lg | long double | 以%f或%e中较短的输出宽度输出长双精度实数 |
%LG | long double | 以%f或%E中较短的输出宽度输出长双精度实数,字母大写 |
%p | void * | 以十六进制形式输出指针的值 |
%n | int * | 此参数必须是一个指向int的指针,printf函数会将已打印的字符数存入这个指针指向的变量中 |
%m | 无 | 输出strerror(errno)的返回值 |
#include <stdio.h>
int main() {
printf("hello world\n");
putchar('a');
return 0;
}