“啊!这是怎么了?难道……难道我穿越了?”柠檬茶说着,并拿起手机看了一眼,原来是2024年。"2024!哈哈哈哈,我要起飞了!"柠檬茶激动地说。然后,她在心里默默盘算着:“还有5年,还有5年就要进入机器人与万物互联元年。我今年22岁,刚毕业,还有时间,还有时间。20年前的房地产我没赶上,十年前的移动互联网我没敢上,这次的新时代我一定要分一杯羹!”
“玛卡巴卡!玛卡巴卡!”柠檬茶的微信突然响了起来。柠檬茶拿起来一看,是阳洋打来的。
“喂,咋了?”柠檬茶问道。
“柠檬茶,分数出来了,你过了吗?”阳洋问道。
柠檬茶突然想起来今天是查专升本分数的日子,但是由于自己专升本的时候总是胡思乱想,再加上本身基础就不好,导致差4分过线。之前还因此难受了好一段时间。
“我没考上,差了4分。我没事,我要去学习了,见面再说。”柠檬茶说着,把电话挂了。心里默默思量着:“这一世,就从嵌入式入手吧。先学数电模电,再学C语言,然后就是开发板。一步一步来,实在不行就报个班,慢慢学。”
柠檬茶想着想着,就打开了优快云,开始写起来!
第一章C语言的由来
按规矩简述大哥
1969年 Ken Thompson,Dennis Ritchie一起开发的unix系统 之后Ken Thompson开发了B语言
1972Dennis Ritchie 在B语言的基础上开发了C语言
第二章安装Clion或者VS
clion需要特殊手段才可以用 咱们新手免费体验就行 如果想继续用就。。。(待补充)
VS是免费的这里提供的是压缩包也可以用自己的
第三章C语言程序结构
第一个程序helloWord
成功
下面是C语言的helloWord
#include <stdio.h>
int main(){
printf("hello,world");
return 0;
}
C 程序运行机制
过程1:编辑
编写C语言源程序代码,并以文件的形式存储到磁盘中。源程序文件以“.c
”作为扩展名。
过程2:编译
将C语言源程序转换为目标程序(或目标文件)
。如果程序没有错误,没有任何提示,就会生成一个扩展名为.obj 的二进制文件。C语言中的每条可执行语句经过编译后最终都将被转换成二进制的机器指令。
过程3:链接/连接
将编译形成的目标文件“.obj”和库函数及其他目录文件连接/链接,形成统一的可执行的
二进制文件“.exe
”。
为什么需要链接库文件呢?
因为我们的C程序中会使用 C程序库的内容,比如<stdio.h> 、<stdlib.h> 中的函数printf()、system()等,这些函数不是程序员自己写的,而是C程序库中提供的,因此需要链接。链接后,生成的.exe 文件,比obj 文件大了很多。
过程4:运行
有了可执行的exe文件,我们可以在控制台下直接运行此exe文件。
注 释
-
源文件中用于
解释
、说明
程序的文字就是注释。 -
注释只是给人看的,程序执行时,
编译器会忽略注释
,注释对代码执行没有影响
C语言中的注释类型:
单行注释
//单行注释
多行注释
/*
* 多行注释
*
*/
HelloWorld的剖析
#include <stdio.h>
int main(){
printf("hello,world");
return 0;
}
① main()
int main(){}
-
每一个程序(或工程)可以定义很多函数(后面讲),但有且只有一个main()函数,作为程序执行的入口,在 main()函数结尾结束整个程序的运行。
-
空括号(),表示 main 不接受任何参数。
-
写在main之前的“int”称为关键字,代表数据类型是整型。它是main()的返回值类型。即在执行main()函数后会得到一个整型值(即函数值)。
-
C 语言约定:
return 0
,表示main()函数终止运行,且运行成功;如果返回其它非零整数,就表示运行失败。默认情况下,如果 main() 里面省略return 0
这一行,编译器会自动加上,但是为了保持统一的代码风格,不建议省略。 -
② 函数体
{}
-
一对花括号{}定义了函数的主体,所有函数都必须以大括号开头和结尾,成对出现。
-
C 程序中的函数体指的是作为该函数一部分的语句。它可以是任何操作,比如搜索、排序、打印等。
-
每一个执行语句后面都会有一个英文分号“;”作为语句结束的标志。
-
一行内可写几条语句,一条语句也可写在几行上。
③ printf()
printf()函数是产生格式化输出的函数,作用是将参数文本输出到屏幕。它名字里面的 f 代表 format (格式化),表示可以指定输出文本的格式。
printf("Hello World"); //将字符串输出到控制台,行尾不换行
为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符 \n 。
printf("Hello World\n");
④ 标准库、头文件
printf() 是在标准库的头文件 stdio.h
中定义的。要想在程序中使用这个函数,必须在源文件头部引入这个头文件。即:
#include <stdio.h>
预处理命令:#include命令
如果要使用某个功能,就必须先加载其对应的头文件,加载使用的是 #include
命令,声明在各文件模块的开头。C语言中以 # 号开头的命令称为预处理命令
。顾名思义,在编译器对当前C程序进行编译前执行预处理操作。
格式:
#include <头文件名>
对比写法:
#include <stdio.h>: //编译系统在系统头文件所在目录搜索
#include "stdio.h": //编译系统首先在当前的源文件目录中查找 stdio.h,找不到的话,再转向系统头文件所在目录搜索。
stdio.h
是系统提供的一个文件名,stdio
是standard input & output的缩写。
结论:
-
引用系统头文件,两种形式都会可以,
#include <>
效率高。
-
引用用户头文件,只能使用
#include ""
。
常用的C头文件
-
stdio.h
——定义核心输入和输出函数 -
stdlib.h
——定义数值转换函数、伪随机网络生成器和内存分配 -
string.h
——定义字符串处理函数 -
stdint.h
——定义精确宽度的整数类型 -
math.h
——定义常用的数学函数 -
stddef.h
——定义了几个有用的类型和宏
printf()标准格式
printf(格式控制字符串,输出列表);
占位符
占位符的第一个字符是 %
,第二个字符表示占位符的类型。
printf() 的占位符有许多种类,与 C 语言的数据类型相对应。
下面按照字母顺序,列出占位符如下,方便查阅(黑色为常用的):
%a :浮点数(仅C99有效)
%A :浮点数(仅C99有效)
%c :char型数据
%d :十进制整数(int)
%e :使用科学计数法的浮点数,指数部分的 e 为小写
%E :使用科学计数法的浮点数,指数部分的 E 为大写
%i :整数,基本等同于 %d
%f :浮点数(float)
%g :6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的 e 为小写
%G :等同于 %g ,唯一的区别是指数部分的 E 为大写
%hd :十进制 short int 类型
%ho :八进制 short int 类型
%hx :十六进制 short int 类型
%hu :unsigned short int 类型
%ld :十进制整数(long)
%lo :八进制 long int 类型
%lx :十六进制 long int 类型
%lu :unsigned long int 类型
%lld :十进制 long long int 类型
%llo :八进制 long long int 类型
%llx :十六进制 long long int 类型
%llu :unsigned long long int 类型
%le :科学计数法表示的 long double 类型浮点数
%lf :十进制浮点数(double)
%n :已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中
%o :八进制整数
%p :指针
%s :字符串
%u :十进制无符号整数(unsigned int)
%x :十六进制整数
%zd : size_t 类型
%% :输出一个百分号
输出格式
格式1:限定宽度
printf() 允许限定占位符的最小宽度。
printf("%5d\n", 123); // 输出为 " 123"
说明:%5d 表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格。
输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空格,可以在占位符的 % 的后面插入一个 - 号。
printf("%-5d\n", 123); // 输出为 "123 "
对于小数,这个限定符会限制所有数字的最小显示宽度
printf("%12f\n", 123.45); // 输出 " 123.450000"
%12f 表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位,所以123.45 输出结果的头部会添加2个空格。
格式2:总是显示正负号
默认情况下, printf() 不对正数显示 + 号,只对负数显示 - 号。如果想让正数也输出 + 号,可以在占位符的 % 后面加一个 + 。
printf("%+d\n", 11); // 输出 +11
printf("%+d\n", -11); // 输出 -11
格式3:限定小数位数
输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面只保留两位,占位符可以写成 %.2f 。
printf("Number is %.2f\n", 0.8); // 输出 Number is 0.80
这种写法可以与限定宽度占位符,结合使用。
printf("%6.2f\n", 0.8); // 输出为 " 0.80"
说明:%6.2f 表示输出字符串最小宽度为6,小数位数为2。整体长度不足 6 位时,右对齐显示。
最小宽度和小数位数这两个限定值,都可以用 * 代替,通过 printf() 的参数传入。
printf("%*.*f\n", 6, 2, 0.8);
//等同于
printf("%6.2f\n", 0.8);
第四章变量与进制
关键字
定义:被C语言赋予了特殊含义,用做专门用途的字符串(或单词)。
特点:全部关键字都是小写字母
。
传统的C语言(ANSI C)有32个关键字。如下:
类型 | 具体关键字 |
---|---|
控制语句关键字(12 个) | break, case, continue, default, do, else, for, goto, if, return, switch, while |
数据类型关键字(12 个) | char, enum, double, long, float, int, short, signed, struct, unsigned, union, void |
存储类型关键字(4 个) | auto, extern, register, static |
其他关键字(4 个) | const, sizeof, typedef, volatile |
后续,1999年,C99标准增加了5个关键字:inline
、restrict
、_Bool
、_Complex
和_Imaginary
。
2011年,C11标准又增加了7个关键字:_Alignas
、_Alignof
、_Atomic
、_Static_assert
、_Noreturn
、_Thread_local
和_Generic
。
说明:
1、ANSI C、C99和C11,它们之间差别并不大,在大多数情况下,它们都是和谐共处的。
2、不需要死记硬背,学到哪里记到哪里即可
标识符
C语言中变量、函数、数组名、结构体等要素命名时使用的字符序列,称为标识符。
- 只能由26个英文字母大小写,0-9 或 _ 组成
- 数字不可以开头
- 不可以是关键字,但可以包含关键字
- C99和C11允许使用更长的标识符名,但是编译器只识别前63个字符。(会忽略超出的字符)
- 不允许有空格。
- 严格区分大小写字母。比如:Hello、hello是不同的标识符。
变量
简单来说变量就相当于你学校的校长 数据类型就是相当于校长是领导(领导有很多所以数据类型也有很多),变量名就是校长这个职务的名字(名字可以使校长也可以是系主任,但必须都是领导因为数据类型是领导) 变量值就相当于校长这个人(假如校长贪污下台了,换了另一个人接任这个职务 就相当于换了个人 也就相当于换了一个变量的值)。通俗不 通俗的话给个赞和关注呗 感谢
- 内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化。
-
通过变量名,可以访问这块内存区域,获取里面存储的值。
-
变量的构成包含三个要素:
数据类型
、变量名
、存储的值
-
C语言中变量声明的格式:
数据类型 变量名 = 变量值
-
-
变量的作用:用于在内存中保存数据。
-
使用变量注意:
-
C语言中每个变量必须先声明,后使用。
-
不同的数据类型,占用的空间大小不一样。
-
一旦声明,变量的类型就不能在运行时修改。
-
变量的声明与赋值
格式:
//数据类型 变量名 =(赋值) 变量值 ; //声明变量的语句必须以分号结尾
int score = 150;
变量的作用域
简单来说作用于只作用于括号内(){} 在哪个里面作用于那个里 只作用于本层
-
变量的作用域:其定义所在的一对{ }内。
-
变量只有在其
作用域
内才有效。出了作用域,变量不可以再被调用。 -
同一个作用域内,不能定义重名的变量。
-
C 语言的变量作用域主要有两种:文件作用域(file scope)和块作用域(block scope)。
文件作用域
指的是,在源码文件顶层声明的变量,从声明的位置到文件结束都有效。
int x = 1;
int main() {
printf("%d\n", x);
return 0;
}
变量按类型的分类
基本数据类型
整数类型
类型说明
C语言规定了如下的几类整型:短整型(short)、整型(int)、长整型(long)、更长的整型(long long)
每种类型都可以被 signed 和unsigned 修饰。其中,
-
使用
signed 修饰
,表示该类型的变量是带符号位的,有正负号,可以表示负值。默认是signed
。 -
使用
unsigned 修饰
,表示该类型的变量是不带符号位的,没有有正负号,只能表示零和正整数。
类型 | 修饰符 | 占用空间 | 取值范围 |
---|---|---|---|
short [int] | signed | 2个字节(=16位) | -32768 ~ 32767 (-$2^{15}$ ~ $2^{15}$-1) |
short [int] | unsigned | 2个字节(=16位) | 0 ~ 65535 (0 ~ $2^{16}$-1) |
int | signed | 通常4个字节 | -2147483648 ~ 2147483647 (-$2^{31}$ ~ $2^{31}$-1) |
int | unsigned | 通常4个字节 | 0 ~ 4294967295 (0 ~ $2^{32}$-1) |
long [int] | signed | 4个或8个字节 | 4字节时:-2147483648 ~ 2147483647 (-$2^{31}$ ~ $2^{31}$-1) |
long [int] | unsigned | 4个或8个字节 | 4字节时:-0 ~ 4294967295 (0 ~ $2^{32}$-1) |
long long int是C99新增
的:
类型 | 修饰符 | 占用空间 | 取值范围 |
---|---|---|---|
long long [int] | signed | 8个字节(=64位) | -9223372036854775808~ 9223372036854775807(-$2^{63}$ ~ $2^{63}$-1) |
long long [int] | unsigned | 8个字节(=64位) | 0 ~ 18446744073709551615(0 ~ $2^{64}$-1) |
说明1:不同计算机的 int 类型的大小是不一样的。比较常见的是使用4个字节(32位)存储一个 int 类型的值,具体情况如下:
类型 | 16位编译器 | 32位编译器 | 64位编译器 |
---|---|---|---|
short int | 2字节 | 2字节 | 2字节 |
int | 2字节 | 4字节 | 4字节 |
unsigned int | 2字节 | 4字节 | 4字节 |
long | 4字节 | 4字节 | 8字节 |
unsigned long | 4字节 | 4字节 | 8字节 |
long long | 8字节 | 8字节 | 8字节 |
说明2:C标准虽然没有具体规定各种类型数据所占用存储单元的长度,但几条铁定的原则(ANSI/ISO制订的): ① sizeof(short int) ≤ sizeof(int) ≤ sizeof(long int) ≤ sizeof(long long),具体由各编译系统自行决定的。其中,sizeof是测量类型或变量长度的运算符。
② short int至少应为2字节,long int至少应为4字节。
浮点类型
类型说明
在C语言中,浮点型变量分为三种:单精度浮点型(float)、双精度浮点型(double)、长双精度浮点型(long double)。
类型 | 占用空间 | 取值范围 |
---|---|---|
float | 4个字节 (=32位) | $-1.410^{-45}$ ~ $-3.410^{+38}$,$1.410^{-45}$ ~ $3.410^{+38}$ |
double | 8个字节 (=64位) | $-4.910^{-324}$ ~ $-1.710^{+308}$,$4.910^{-324}$ ~ $1.710^{+308}$ |
long double | 12个字节(=96位) | 太大了... |
其中,
类型 | 16位编译器 | 32位编译器 | 64位编译器 |
---|---|---|---|
float | 4字节 | 4字节 | 4字节 |
double | 8字节 | 8字节 | 8字节 |
关于后缀:
对于浮点数,编译器默认指定为 double 类型,如果希望指定为float类型,需要在小数后面添加后缀 f
或F
;如果希望指定为long double类型,需要在小数后面添加后缀 l
或L
。
float x = 3.14f;
double x = 3.14;
long double x = 3.14L;
字符类型
C语言中,使用 char 关键字来表示字符型,用于存储一个单一字符
。
字符型变量赋值时,需要用一对英文半角格式的单引号(''
)把字符括起来。
每个字符变量,在16位、32位或64位编译器中都是占用 1 个字节(=8位)
。
表示方式1:最常见
char c = 'A'; //为一个char类型的变量赋值字符'A'
每个字符对应一个整数(由 ASCII 码确定),比如 A 对应整数 65 。
只要在字符类型的范围之内,整数与字符是可以互换的,都可以赋值给字符类型的变量。
表示方式2:ASCII 码值
char c = 66;
// 等同于
char c = 'B';
两个字符类型的变量可以进行数学运算。
char a = 'B'; // 等同于 char a = 66;
char b = 'C'; // 等同于 char b = 67;
printf("%d\n", a + b); // 输出133
igned 和 unsigned 修饰:
根据C90标准,C语言允许在关键字char前面使用signed或unsigned。
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255
注意,C 语言规定 char 类型默认是否带有正负号,由当前系统决定,这一点与 int 不同, int 等同于 signed int 。
单引号本身也是一个字符,如果要表示这个字符常量,必须使用反斜杠转义。
char t = '\'';
布尔类型
C99 标准添加了类型 _Bool
,表示布尔值,即逻辑值true和false。但是,这个类型的值其实只是整数类型的别名,使用 0 表示false, 1 表示true,其它非0的值都会被存储为1。所以_Bool类型实际上也是一种整数类型。
#include <stdio.h>
int main() {
_Bool isFlag = 1;
if (isFlag)
printf("宝贝儿~~\n");
return 0;
}
变量间的运算规则
在C语言编程中,经常需要对不同类型的数据进行运算,运算前需要先转换为同一类型,再运算。为了解决数据类型不一致的问题,需要对数据的类型进行转换。
隐式类型转换
情况1:窄类型自动转为宽类型
又称为自动类型转换即,系统自动将字节宽度较小
的类型转换为字节宽度较大
的数据类型。
可以这样理解 你把1L水 放在1.5L的水瓶里 然后你又搞一个装了1L水的5L水桶 你把这两个水桶里的水装起来 系统为了装水自动取了5L的水桶 水桶就是类型 及为了满足你的需求自动选择最大的
//char类型 与 int类型运算,会自动提升为 int 。
char c = 10;
int i = 10;
int j = c + i; //ok
情况2:宽类型赋值给窄类型
字节宽度较大
的类型,赋值给字节宽度较小
的变量时,会发生类型降级,自动转为后者的类型。这时可能会发生截值(truncation),系统会自动截去多余的数据位,导致精度损失。
简单理解 同上 两个水桶1.5L的水桶和5L的水桶 每个水桶里装了1L的水 你非要装到1.5L的桶里 因为水桶就1.5L 所以肯定有部分水会流出来 流出来的这部分水就是损失的精度。
double pi = 3.14159;
int i = pi; // i 的值为 3
强制类型转换
隐式类型转换中的宽类型赋值给窄类型,编译器是会产生警告的,提示程序存在潜在的隐患。如果非常明确地希望转换数据类型,就需要用到强制(或显式)类型转换.
形式: (类型名称)(变量、常量或表达式)
道理同上 但是如果你还是有上述两个水桶 但是每个水桶里只有0.5L水 你知道1.5L的水桶也能装下 但是系统会默认选择最大的,这时你想要节约空间你就需要强制转换类型 告诉系统你想装到1.5L的水桶里
double x = 12.3;
int y = 10;
int z = (int)x + y; //将变量x的值转换成int后,再与y相加
运算的溢出问题
每一种数据类型都有数值范围,如果存放的数值超出了这个范围(小于最小值或大于最大值),需要更多的二进制位存储,就会发生溢出。
unsigned char x = 255;//以为char类型的范围就是0-255所以如果产生错误
x = x + 1;
printf("%d\n", x); // 0
溢出很容易被忽视,编译器又不会报错,所以必须非常小心。
常量
常量分类
C语言中的常量分为以下以下几种:
字面常量
1、2、12是整型常量,2.1、12.5、3.14是实型常量,'a'、 'b'、'c'是字符型常量。
#include <stdio.h>
int main(){
//字面常量
3.14;//字面常量
1000;//字面常量
}
#define 定义的标识符常量
这种方式是在文件开头用 #define 来定义常量,也叫作“宏定义”。所谓宏定义,就是用一个标识符来表示一个常量值,如果在后面的代码中出现了该标识符,那么编译时就全部替换成指定的常量值。即用宏体替换所有宏名,简称宏替换
。
定义格式:#define 符号常量名 常量值
习惯上,宏名用大写字母表示,以便于与变量区别。但也允许用小写字母
类似Java的final修饰的变量 因为前面加了#号所以和include一样会预编译
#include <stdio.h>
#define PI = 3.14 // 定义常量 PI,常量值 3.14。因为宏定义不是 C 语句,后面不能有分号
int main() {
//PI = 3.1415 可以吗? => 不可以
double area;
double r = 1.2;
area = PI * r * r;
printf("面积 : %.2f", area);
getchar();
return 0;
}
const 修饰的常变量
C99中新的声明方式,这种方式跟定义一个变量是一样的,只需要在变量的数据类型前再加上一个const关键字,这被称为“限定符”。
格式:const 数据类型 常量名 = 常量值;
类似
const修饰的对象一旦创建就不能改变,所以必须初始化。
跟使用 #define定义宏常量相比,const定义的常量有详细的数据类型,而且会在编译阶段进行安全检查,在运行时才完成替换,所以会更加安全和方便。
#include <stdio.h>
int main(){
//const 修饰的常变量
const float PI = 3.14f;
//PI = 5.14;//是不能直接修改的!
return 0;
}
枚举常量
#include <stdio.h>
//使用enum定义枚举类
enum Sex{
//括号中的MALE,FEMALE,SECRET是枚举常量
MALE,
FEMALE,
SECRET
};
int main(){
//枚举常量
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量默认是从0开始,依次向下递增1的
return 0;
}
输入/输出函数
c语言本身没有提供专门的输入输出语句,所有的输入输出都是由调用标准库函数中的输入输出函数来实现的。
输入函数:scanf() 、 getchar()、gets():
-
scanf(),是格式输入函数,可接收
任意类型
的数据。 -
getchar(),是
字符
输入函数, 只能接收单个字符
。 -
gets(),是
字符串
输入函数。
输出函数:printf() 、 putchar()、puts():
-
printf(),是格式输出函数,可按指定的格式显示任意类型的数据。
-
putchar(),
字符
显示函数,只能显示单个字符
。 -
puts(),是
字符串
输出函数。
scanf()的使用
int main(){
float radius,area;
printf("请输入半径: \n");
fflush(stdout);//在求圆的时候出现了一个问题控制台什么都没显示 直接让输入所以需要清空一下缓存
scanf("%f",&radius);
area = 3.14 * radius * radius ;
printf("圆的面积为 :%f",area);
return 0;
}
控制台不显示 请看 CLion-printf在scanf前却先运行scanf后运行printf的解决方案 不是我写的但是好用 推荐
getchar()与putchar()的使用
-
getchar():输入字符数据
-
格式:getchar()
-
功能:从键盘缓冲区读入一个字符
-
-
putchar():输出字符
-
格式: putchar(ch),其中ch是一个字符变量
-
功能:从标准输出设备输出一个字符
-
char a ;
printf("请输入一个字符 :");
fflush(stdout);
a =getchar();
putchar(a);
gets()与puts()的使用(超纲)
在C语言中,puts() 是一个用于输出字符串的标准库函数,其原型定义在 <stdio.h>
头文件中。puts()
函数的作用是将一个以 null 字符(\0
)结尾的字符串打印到标准输出(通常是控制台)上,并自动添加一个换行符。
char name[10];
printf("请输入你的名字: ");
fflush(stdout);
gets(name);
printf("你输入的名字为: ");
puts(name);
运算符
所有运算符
优先级 | 运算符 | 含义 | 结合方向 | 对象个数 | 用法举例 |
---|---|---|---|---|---|
1 | () | 圆括号 | 从左到右 | c*(a+b) | |
1 | [ ] | 下标运算符 | 从左到右 | a[0] | |
1 | -> | 指向结构体成员运算符 | 从左到右 | a->b | |
1 | . | 结构体成员运算符 | 从左到到右 | .a | |
2 | ! | 逻辑非运算符 | 从右到左 | 1(单目运算符) | !a |
2 | ~ | 按位取反运算符 | 从右到左 | 1(单目运算符) | ~a |
2 | ++ | 自增运算符 | 从右到左 | 1(单目运算符) | a++或++a |
2 | -- | 自减运算符 | 从右到左 | 1(单目运算符) | a--或--a |
2 | ( 类型 ) | 类型转换运算符 | 从右到左 | 1(单目运算符) | (int)a |
2 | * | 取值运算符 | 从右到左 | 1(单目运算符) | *a |
2 | & | 取地址运算符 | 从右到左 | 1(单目运算符) | &a |
2 | sizeof | 长度运算符 | 从右到左 | 1(单目运算符) | sizeof(a) |
3 | * | 乘法运算符 | 从左到右 | 2(双目运算符) | a*b |
3 | / | 除法运算符 | 从左到右 | 2(双目运算符) | a/b |
3 | % | 取余运算符 | 从左到右 | 2(双目运算符) | a%b |
4 | + | 加法运算符 | 从左到右 | 2(双目运算符) | a+b |
4 | - | 减法运算符 | 从左到右 | 2(双目运算符) | a-b |
5 | << | 左移运算符 | 从左到右 | 2(双目运算符) | a<<b |
5 | >> | 右移运算符 | 从左到右 | 2(双目运算符) | a>>b |
6 | > | 大于运算符 | 从左到右 | 2(双目运算符) | a>b |
6 | >= | 大于等于运算符 | 从左到右 | 2(双目运算符) | a>=b |
6 | < | 小于运算符 | 从左到右 | 2(双目运算符) | a<b |
6 | <= | 小于等于运算符 | 从左到右 | 2(双目运算符) | a<=b |
7 | == | 判等运算符 | 从左到右 | 2(双目运算符) | a==b |
7 | != | 不等于运算符 | 从左到右 | 2(双目运算符) | a!=b |
8 | ^ | 按位异或运算符 | 从左到右 | 2(双目运算符) | a^b |
9 | & | 按位与运算符 | 从左到右 | 2(双目运算符) | a&b |
10 | | | 逻辑或运算符 | 从左到右 | 2(双目运算符) | a|b |
11 | && | 逻辑与运算符 | 从左到右 | 2(双目运算符) | a&&b |
12 | , | 逗号运算符 | 从左到右 | 2(双目运算符) | a,b |
13 | ?: | 条件运算符 | 从右到左 | 3(三目运算符) | a?b:c |
14 | = | 赋值运算符 | 从右到左 | 2(双目运算符) | a=b |
14 | += | 加后赋值运算符 | 从右到左 | 2(双目运算符) | a+=b |
14 | -= | 减后赋值运算符 | 从右到左 | 2(双目运算符) | a-=b |
14 | *= | 乘后赋值运算符 | 从右到左 | 2(双目运算符) | a*=b |
14 | /= | 除后赋值运算符 | 从右到左 | 2(双目运算符) | a/=b |
14 | %= | 取余后赋值运算符 | 从右到左 | 2(双目运算符) | a%=b |
14 | >>= | 右移后赋值运算符 | 从右到左 | 2(双目运算符) | a>>=b |
14 | <<= | 左移后赋值运算符 | 从右到左 | 2(双目运算符) | a<<=b |
14 | &= | 按位与后赋值运算符 | 从右到左 | 2(双目运算符) | a&=b |
14 | ^= | 按位异或后赋值运算符 | 从右到左 | 2(双目运算符) | a^=b |
14 | |= | 按位或后赋值运算符 | 从右到左 | 2(双目运算符) | a|=b |
15 | , | 逗号运算符 | 从左到右 | a, b, ... |
不用记知道就行 不会回来查!!