# 常量与变量

# 关键字

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;
}

# shortintlonglong 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

  • shortintlonglong 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;
}

# 实型 floatdouble

实型变量是用来存储实数的,包括小数和整数。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 floatdouble 以指数形式输出单精度实数、双精度实数
%E floatdouble 以指数形式输出单精度实数、双精度实数,字母大写
%g floatdouble 以%f或%e中较短的输出宽度输出单精度实数、双精度实数
%G floatdouble 以%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;
}