跳转至

Chapter1 C语言基础


1.1 存储

存储类型

auto-局部变量(自动变量):

  • auto是所有局部变量默认的存储类
  • auto定义一个自动的局部变量,每次执行到定义该变量时,都会产生一个新的变量,并对其重新初始化
  • 函数中的变量默认为auto存储类,在函数开始时被创建,在函数结束时被销毁

register-寄存器变量:

  • register存储类用于定义存储在寄存器而不是RAM中的局部变量
  • 变量访问速度更快,但不能直接取地址
  • 用于需要快速访问的变量,比如计数器
  • 如果寄存器满了,被修饰的变量会默认回到auto

static-静态局部/全局变量:

  • static修饰局部变量是和auto相对而言的,两者的作用域都仅限于声明局部变量的函数之中,但static修饰的局部变量初始化操作只在第一次执行时起作用。在随后的运行过程中,变量将保持语句块上一次执行时的值
  • static修饰全局变量会使其作用域限制在声明它的文件内

extern-全局变量:

  • 非静态的全局变量默认的存储型为extern
  • extern存储类用于声明在其他文件中声明的全局变量或函数,这些全局变量或函数将要用到但可能尚未定义
  • 使用extern关键字时,不会为变量分配任何存储空间,而只是指示编译器该变量在其他文件中定义

存储位置

栈区:

  • 局部变量(包括const修饰的)
  • 函数形参和返回值

堆区:

  • malloc动态分配

静态存储区(全局区):

  • 全局变量
  • 静态变量

常量存储区:

  • 字符串
  • const修饰的全局变量

1.2 运算符

优先级和结合方向:

运算符(优先级由高到低) 结合方向
后缀:() [] -> $\rightarrow$
一元:! ~ + - ++ -- * & (type)sizeof $\leftarrow$
乘除:/ * % $\rightarrow$
加减:+ - $\rightarrow$
移位: ≪ ≫ $\rightarrow$
关系:< > <= >= $\rightarrow$
相等:== != $\rightarrow$
位与:& $\rightarrow$
位异或:^ $\rightarrow$
位或:| $\rightarrow$
逻辑与:&& $\rightarrow$
逻辑或:|| $\rightarrow$
条件:?: $\leftarrow$
赋值:= += -= *= \= %= $\leftarrow$
逗号:, $\rightarrow$

符号介绍:

  • ≪(左移运算符):
    将一个数的二进制向左移动指定的位数,并在右侧补上0.语法形式为x≪n,其中x表示要进行左移操作的数,n表示要左移的位数。其实际效果是将x乘上2的n次方。

  • ?:(三目运算符):
    语法形式为(判别式)?(表达式1):(表达式2),如果判别式为真(值为1),则返回表达式1;如果判别式为假(值为0),则返回表达式2。

  • ++(自增运算符):
    ++n的运算顺序是:先执行n=n+1,再将n新的值作为表达式++n的值
    n++的运算顺序是:先将n的原值作为表达式n++的值,再执行n=n+1
    自增运算符和自减运算符的运算对象不能为常量(3++)或表达式(++(i+j))

  • ~(取反位运算符):
    将一个数的二进制按位取反

  • &(按位“与”运算符):
    将两个数二进制下对应的位一一进行与运算,即对应位均为1时结果才为1。

Example

例如a=84,b=59,则a&b==16。
01010100
00111011(&)
————
00010000

  • |(按位“或”运算符):
    将两个数二进制下对应的位一一进行或运算,即对应位有1时结果即为1。

  • ^(按位“异或”运算符):
    将两个数二进制下对应的位一一进行异或运算,即对应位一个为1另一个为0时结果才为1。


1.3 输入输出标准

scanf()/printf()

格式控制字符:

格式控制字符 对应类型
%d 十进制整数 int
%ld 长整型 long long
%o 八进制整数
%x 十六进制整数
%u 十进制无符号数 unsigned
%lu 无符号长整型 unsigned long long
%f 单精度浮点数 float
%lf 双精度浮点数 double
%e 浮点数(输出)
%c 字符
%s 字符串
%p 十六进制指针地址

转义字符:

转义字符 含义
\n 换行
\r 回车
\t 水平制表(Tab)
\b 退格
\\ 反斜线
\" 双引号
\' 单引号
\? 问号

Note

反斜线、双引号、单引号和问号无法直接输出,因为它们有特殊的用途。

getchar()/putchar()

以单个字符作为读写对象。

gets()/puts()

以字符串作为读写对象。


1.4 特殊语句/函数/运算符

switch语句

switch语句用于选择项较多的判断。

1
2
3
4
5
6
7
switch(a)
{
    case 1:printf("1");break;
    case 2:printf("2");break;
    case 3:printf("3");break;
    default:printf("no");
}

goto语句

goto语句可以快速跳转代码,常用于跳出多重循环或跳到函数的末尾,但不建议使用。

1
2
3
4
5
goto END;
x++;
y++;
END:
z=x+y;

enum语句

enum 枚举名 {枚举元素1,枚举元素2,···};

1
2
3
4
5
6
7
enum DAY
{
    MON=1,TUE,WED,THU,FRI,SAT,SUN
};
enum DAY day;
day=WED;
printf("%d",day);//输出为3
  • enum类型被当作int来处理
  • 枚举类型连续时可以使用for来遍历
1
2
3
4
for(day=MON;day<=SUN;day++)
    {
        printf("枚举元素%d\n",day);
    }

time()函数

  • 标准库:time.h
  • time(0)返回一个长整数,即格林尼治时间1970年1月1日00:00:00到当前时刻的时长,单位为秒。
  • time()函数可用于计算代码运行的时间,例如:
1
2
3
4
#include<time.h>//使用time()函数需要声明的头文件
time_t then = time(0);//time()返回的类型为time_t,本质是long long型(使用了typedef)
//中间是想要测试运行时间的代码
printf(%llu\n, time(0)-then);

malloc()函数

  • 标准库:stdlib.h
  • malloc()函数分配所需的内存空间,并返回一个指向它的指针
Node *p=(Node *)malloc(sizeof(Node));
//Node是一个结构体,p是一个指向结构体的指针变量,sizeof(Node)是该结构体所需要的内存,malloc函数分配一块空间,强制转换为指针类型后返回一个指向该空间的指针给p

typedef语句

typedef用于类型名的替换。

typedef int myint;//用myint代替int,相当于给类型名换名字

typedef struct{
    int month;
    int day;
    int year;
}Date;
//用Date替换struct


typedef int line[80];
//给一个80位的数组类型命名为line

评论