C语言基础内容小总结
文章目录
1 转义字符
场景,将目录c:\vscode\aboutc.c
打印在屏幕上。
#include<stdio.h>
int main()
{
printf("c:\vscode\aboutc.c");
return 0;
}
程序运行结果和预期产生不同。实际上,编译器会将\v``\a
作为转义字符来解释了。
转义字符:
名称 | 含义 |
---|---|
\? | 在书写多个问号时使用,防止被解析成三字字母词 |
\' | 表示字符常量' |
\" | 表示字符串内部双引号 |
\\ | 表示反斜杠,防止其被解释为一个转义序列符 |
\a | 警告字符 |
\b | 退格符,光标左移 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示三个八进制的数字 |
\xdd | dd表示2个十六进制的数字 |
#include<stdio.h>
int main()
{
printf("%c\n", '\''); //打印字符 '
printf("%s\n", "\""); //打印字符串 ”
return 0;
}
2 关键字
auto、break、case、char、const、continue、default、do、double、else、enum 、extern、float、for、goto、if、int、long、register、return、short、signed、sizeof、static、struct、define、switch、typedef、union、unsigned、void、volatile、while
2.1 auto
在 C 语言以及 C++98 中,auto 仅用于声明变量是自动类型的变量,具有自动存储期。此类型变量在进入变量声明的程序块中才会被建立,程序退出程序块时该变量就会被销毁。
void function()
{
//a为一个自动类型的变量,等同于 auto int a=0;
int a = 0;
}
而在C++中,auto关键字用来进行类型的推导。相对于哪种类型定义特别长的变量定义的话,就可以使用auto进行变量类型的自动推导。
std::vector<int>::iterator it=v.begin();
等价于
auto it=v.begin();
在C++14中,当函数值返回值不确定的时候,可以使用auto作为返回值的类型推断出auto的类型。
auto function()
{
return 0;
}
注意:函数参数不能是auto类型。类的成员变量也不能是auto类型。类的静态成员变量可以是auto类型的,但是需要使用const进行修饰,且该变量的值得在类内初始化。
2.2 extern
extern
关键字用于在C/C++中声明一个变量或函数,但并不定义。extern
告诉编译器该变量或者函数在其它文件中进行定义了。
主要用于声明外部变量和函数。
//main1.cpp
extern void func();
//main2.cpp
void func()
{
//.......
}
只在main1.cpp中只声明func
函数并不定义它,func
函数已经在另一个文件当中定义过了。
extern
作用:
- 声明全局变量
extern int global_var;
- 声明外部函数
extern void func();
- 防止头文件重复包含,在头文件中使用
extern
声明外部头文件,避免头文件重复包含。
//header.h
#ifndef HEADER_H
#define HEADER_H
extern int global_var;
extern void func();
#endif
- 声明外部枚举,在多个源文件中使用同一个枚举类型
//enum.hpp
enum Color
{
red,
black,
green
};
//main.c
#include"enum.hpp"
int main()
{
Color color = red;
printf("%s\n", color);
}
- 声明外部结构体或联合体
注意:在使用extern声明的外部变量或函数时,需要在定义处进行声明。
//main.c
#include<stdio.h>
extern int global_var;
extern int func();
int main()
{
global_var=20;
int result=func();
printf("global var:%d,result:%d\n",global_var,result);
return 0;
}
//func.c
#include<stdio.h>
int func()
{
return global_var*2;
}
2.3 goto
goto关键字在C中是实现程序在特定条件下跳转到程序中的指定位置,从而改变代码的执行流程。只要实现循环,条件语句等控制结构。
#include<stdio.h>
int main()
{
//test1();
label1:
printf("label1\n");
label2:
printf("label2\n");
int i = 1;
while (i <= 3)
{
printf("%d\n", i);
if (i == 2)
{
goto label2;
}
i++;
}
goto label1;
printf("this line is never executed.\n");
return 0;
}
goto基本用法:
- 声明标签:在代码块开始处使用冒号
:
声明一个标签。
label_name:
- 使用goto跳转:在需要跳转的地方使用goto关键字,之后跟着标签名称。
goto label;
- 返回跳转:在标签处使用结束符(如分号)表示跳转结束。
label_name:
//代码块
goto label_name;
goto语句的一些常见用途:
- 快速跳出循环
- 避免重复退出
- 集中处理错误
虽然goto可以在某些情况下提高代码的可读性和简洁性,但过度使用会导致代码流程教混乱,降低代码的可维护性。
2.4 register
register常见作用和用法:
- 注册变量
当register用于声明一个变量时,暗示编译器该变量会被频繁地使用,希望将其保存在cpu寄存器中以此来提高存取速度。变量必须是能被cpu寄存器可以接受的类型;register变量在某些情况下可能不存放在内存中,所以不能使用取地址运算符&
进行操作。- 设备注册
在操作系统中,register用于注册设备驱动程序。
如,在Linux下,register_chrdev()函数用于注册一个字符设备,该函数将一个设备驱动程序与一个设备字符串关联,以便内核可以在需要时找到并加载该驱动程序。- 异常处理
在某些编程语言,如PHP中,register函数用于处理异常。
register_error_handler()函数用于注册一个错误处理函数,以便在程序运行过程中捕获和处理错误。- 编程约定
在某些编程语言和框架中,register作为一种编程约定,用于命名与某个功能或模块相关的变量、函数等。助于提高代码的可读性和可维护性。
2.5 static
static关键字作用和用法:
- 修饰局部变量
- 改变生命周期:用static修饰的局部变量会在程序结束时才会被释放,而非函数调用结束时,即静态局部变量在多次调用函数时,其值会保留上一次调用的值。
- 改变作用域:静态局部变量作用域仅限于当前文件,不能在其它文件中引用。
- 修饰全局变量
- 改变作用域:用static修饰的全局变量只能在定义它的文件中引出,不能在其他文件中通过extern关键字引用。
- 修饰函数
- 改变作用域:用static修饰的函数只能在本文件中调用,不能在其它文件中通过头文件声明方式调用,助于保护函数内部数据,防止外部溢出。
2.6 typedef
主要给数据类型定义别名。
- 为已有的类型定义别名
typedef int DataType;
给int取别名DataType。- 为结构体取别名
struct Node
{
int left;
int right;
struct Node next;
};
typedef struct Node Node;//给结构体struct Node取别名Node
Node a;
- 为函数指针取别名
typedef int(*PF)(int,int);
PF ptr;
- 为数组取别名
typedef int array[10];
array a1;
- 定义枚举类型。自定义类型等。
2.7 define
define关键字在C/C++编程中主要用于定义宏。宏是一种预处理指令,可以在编译时被替换为相应的值。
define关键字用法:
- 定义常量
#define max 100
- 定义宏
#define max(a,b) ((a)>(b)?(a):(b))
- 定义函数
使用define定义函数,可以在编译时将函数名替换为相应的函数体。
#define my_func(x) int x; x=x+10; return x;
- 定义条件编译
使用define定义条件编译,可根据不同条件编译不同的代码
#ifdef debug
printf("debug mode\n");
#else
printf("release mode\n");
#endif
- 定义错误处理
使用define定义错误处理宏,方便处理程序中的错误
#define throw_error(msg) throw std::runtime_error(msg);
2.8 volatile
volatile关键字用于声明变量,确保变量的值在任何时刻都能被其它线程立即被查看到。在多线程中可以防止编译器、处理器或其他线程对变量的优化影响可见性。
volatile关键字作用:
- 声明变量
- 访问变量
- 修改变量
- 避免指令重排序
3 常量
C中常量分为:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
#include<stdio.h>
//one、two、three都是枚举常量
enum Num
{
one,
two,
three
};
int main()
{
10; //字面常量
const float pi = 3.14; //const修饰常量
#define num 100 //#define定义的标识符常量
return 0;
}
4 操作符
- 算术操作符
+
-
*
/
%
%
只能作用于两个整数- 除了
%
操作符其它操作符都可以操作整数和浮点数/
操作符在执行的时候只要有浮点数那么最终的计算结果就是浮点数类型
- 移位操作符
<<
>>
<<
:左移操作符,左边抛弃,右边进行补0
>>
:右移操作符
- 逻辑移位:左边用0进行填充,右边位直接丢弃
- 算术右移:左边用该值的符号位进行填充,右边直接丢弃
注意:移位操作符不可以操作负数,此为标准未定义的。
3. 位操作符
&
^
|
操作数都是整数。
&
按位与:对两个二进制数进行按位与操作,只有当两二进制数都为1时,二者与的值才为1,1&1=1,1&0=0,0&0=0^
按位异或:对两个二进制数进行按位或操作,当两二进制数不同时,两者异或结果就为1,1 ^ 1=0,1 ^ 0=1,0 ^ 0=0|
按位或:对两个二进制数进行按位或操作,当至少一个二进制数为1时,两者或的结果为1,1|1=1,1|0=1,0&0=0
- 赋值操作符
=
+=
-=
*=
/=
&=
^=
|=
>>=
<<=
实现复合的结果。
- 单目操作符
!逻辑反操作
-负值
+正值
&取地址
sizeof操作数类型长度(字节为单位)
~对二进制数据按位取反操作
--前置或后置--
++前置或后置++
*解引用操作符
(类型)强制类型转换
- 关系操作符
>
>=
<
<=
==
!=
- 逻辑操作符
&&
||
- 条件操作符
exp1?exp2:exp3
- 逗号表达式
用逗号来进行隔开的表达式,执行顺序为从左至右,整个表达式的最终结果为最后一个表达式的结果
exp1,exp2,exp3...expN
int test5()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
printf("%d\n", c);//13
}