词法符号
目录
算术运算符
+(加)
-(减)
*(乘)
/(除)
%(取余)
++(自增)
--(自减)
自增自减
自增(自减)分为:前++(--)和后++(--)
例子:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 10;
int b = a++ + ++a;
printf("%d\n",b);
return 0;
}
//注意:前++(--)会等所有值加(减)完才进行赋值
例子:
结果:
关系运算符
>(大于)
< (小于)==(相等于)
>=(大于等于)
<=(小于等于)
!=(不相等于)
逻辑运算符
与:&&
//全真为真、有假为假
或:||
//全假为假、有真为真
非:!
//真假互换
与或非
例子:
与:&& 或:|| 非!
1 && 1 = 1 1 || 1 = 1 ! 1 = 0
1 && 0 = 0 1 || 0 = 1 ! 0 = 1
0 && 1 = 0 0 || 1 = 1
0 && 0 = 0 0 || 0 = 0
//注意:在使用&&(||)时要注意好短路问题
与(&&)前面为真时,后续的将不执行;
或(||)前面为假时,后续的将不执行;
例子:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
if(a != 1 || a+10)
{
printf("a短路:%d\n",a);
}
return 0;
}
结果:
因为a==1,条件中a!=1为假根据短路法则或(||)只要前面条件为假时,后续条件不执行
位运算符
//每一位都要运算
位与:&
//全1为1,有0为0;
位或:|
//全0为0,有1为1;
取反: ~
//0和1互换
异或:^
相同为0,相异为1;
左移: <<
右移: >>
& | ^
例子(& | ^):
位与:& 位或:| 异或:^
01 & 10 = 00 01 & 10 = 11 01 & 10 = 11
11 & 00 = 00 11 & 00 = 11 11 & 00 = 11
11 & 01 = 01 11 & 01 = 11 11 & 01 = 10
00 & 01 = 00 00 & 01 = 01 00 & 01 = 01
左移
例子(左移):
正数:左移时直接往左边进行左移
int 10 <<3
第一步:十进制转二进制 :10 = 0000 1010
第二步:左移 :0000 1010 (<<3) ==> 01010 0000
第三步:二进制转十进制 :0101 0000 = 80
10左移3位后等于80
//注意:负数移动时移动的是补码,补码移动后又变为原码,所以我们要转换2次
(补码 = 原码取反+1)//计算机储存是以补码的形式存储的
负数:左移时补码往左边进行左移
int -10 <<3
第一步:十进制转二进制 :-10 = 1000 1010(原码)
第二步:转为补码(取反) :1000 1010 = 1111 0101
第三步:转为补码(取反+1) :1000 1010 = 1111 0110
第四步:左移后补码变为原码 :1111 0110 (<<3) ==> 1011 0000(原码)
第五步:转为补码(取反) :1011 0000 = 1100 1111
第六步:转为补码(取反+1) :1100 1111 = 1101 0000
第七步:计算 :1101 0000 = -80
-10左移3位后等于-80
右移
例子(右移):
//注意:右移分有符号和无符号,无符号与左移相当,有符号移动的为符号位
无符号:右移时直接往右边进行右移
unsigned int 10 >>3
第一步:十进制转二进制 :10 = 0000 1010
第二步:右移 :000 1010 (>>3) ==> 0000 0001
第三步:二进制转十进制 :0000 0001 = 1
10右移3位后等于1
//注意:负数移动时移动的是补码,补码移动后又变为原码,所以我们要转换2次
(补码 = 原码取反+1)//计算机储存是以补码的形式存储的
有符号:右移时补码往右边进行移动时移动的是符号位
int -10 >>3
第一步:十进制转二进制 :-10 = 1000 1010(原码)
第二步:转为补码(取反) :1000 1010 = 1111 0101
第三步:转为补码(取反+1) :1000 1010 = 1111 0110
第四步:左移后补码变为原码 :1111 0110 (>>3) ==> 1111 1110(原码)
第五步:转为补码(取反) :1111 1110 = 1000 0001
第六步:转为补码(取反+1) :1000 0001 = 1000 0010
第七步:计算 :1000 0010 = -2
-10右移3位后等于-2
清0操作
m& ~(1<<n)//让m的第n位清0
例子(清0):
000 0010 &= ~(1<<3)//让她的第3位清0;
第一步:让1左移3位后取反 :0000 1010 ~(1<<3) ==> 0000 0010
第二步:将清0前的值和清0后的值相& :0000 1010 & 0000 0010 ==> 0000 0010
完成 :完成对第三位清0 :0000 0010
置1操作
m|(1<<n)//让m的第n位置1
000 0010 |=(1<<2)//让她的第2位置1;
第一步:让1左移2位 :0000 1010 (1<<2) ==> 0000 1110
第二步:将置1前的值和置1后的值相| :0000 1010 | 0000 1110 ==> 0000 1110
完成 :完成对第二位置1 :0000 1110
逗号运算符
赋值时只看最后一次赋值给变量;
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = (12, 13, 56, 90, 100);
printf("逗号运算只看最后一次赋值:%d\n",a);
return 0;
}
结果:
三目运算符
一目运算符
一目:只有一个操作对象的运算符
例如:!、~等;
二目运算符
二目:有两个操作对象的运算符
例如:+、-、*、/等;
三目运算符
三目:有三个操作对象的运算符
一般形式:
(表达式1) ?(表达式2) :(表达式3);
执行逻辑 如果(表达式1)为真,执行(表达式2),为假,执行(表达式3);
//用法类似于if
标点符
; ————(分号),表示一个语句的结束
() ————(小括号),作用优先级,函数的标志,用来装表达式
{} ————(大括号),表示一个函数体,括起来的都是该函数的代码
[] ————(中括号),变址符,一般用于数组
<> ————(尖括号),般用于库头文件的引用
" " ————(双引号),括起来的一定是字符串,自定义头文件的引用
' ' ————(单引号),括起来的一定是单个字符
, ————(逗号),分隔符,逗号运算符
% ————(百分号),取余,表示输出格式类型
\ ————(反斜杠),转义字符
: ————(冒号),三目运算符,选择语句
? ————(问号),三目运算符
! ————(感叹号),非
取地址符
&
//注意(取地址符)&*(取内容符)互为逆运算;
例如:&a,获取a变量的地址
取内容符
*
//解引用
取地址上的内容
分隔符
//注释
//
注释掉一行代码
例如:
//代码
/**/
注释掉多行代码
例如:
/*代码块*/
求字节符
sizeof
一般形式
sizeof (对象);
可以求出对象的大小;
标识常量符
//注意:只做替换
1、常量替换
2、表达式替换
3、代码替换
4、数据类型替换
5、宏函数