1、运算符
算术运算符:+ - * / % ++ --
关系运算符:> >= <
逻辑运算符:&& || !
位运算符:& | ~ ^ >
赋值运算符:=
复合赋值运算符:+= -= *= /= %= &= |= ^= >=
内存和地址:[] . -> & *
其他:
三目运算符:条件运算符:? :
sizeof() return () ,
1.1、算术运算符
运算符 | 功能 | 举例 |
+ | 加法 | a+b |
- | 减法 | a-b |
* | 乘法 | a*b |
/ | 除法 | a/b |
% | 求余(取模) | a%b |
++ | 自增 | a++,++a |
-- | 自减 | a--,--a |
关注点:
1.减号也是负号,-a,用来取变量的相反数
2.求余(取模)运算符要求,左右两边的操作数必须是整型数据(0除外),字符型数据也可以,因为字符型数据操作的是它本身的ASCII码值。
3.自增和自减运算,不经可以对整型操作,也可以对浮点型,指针,字符型进行操作。
4.+ - * / %都是双目运算符,++ --是单目运算符,+ - 在当做取正和取负的时候是单目运算符。
前缀自增自减运算:先进行自增自减,在参与运算 ++a --a
后缀自增自减运算:先参与运算,在进行自增自减 a++ a--
做自增自减运算的时候,只要有自增和自减,那么这个值在参与运算之后,一定会加一次
表达式: int a = 10; //12 11 int b = ++a + a++; printf("b = %d\n", b);//23 从左往右计算,有多个自增自减同时运算的时候,后缀的自增自减会在当前位置直接用作输出 前缀自增自减会等所有的自增自减运算做完了之后在做输出。
Ubuntu里面,编译器在编译printf函数的时候,按照从右往左的顺序进行编译,有多个自增自减同时运算的时候,后缀的自增自减会在当前位置直接用作输出,在进行自增自减的过程中,前缀自增自减会等所有的自增自减运算做完了之后在做输出。
int a = 10; //当有多个自增自减的时候,++a会在最后计算完所有的自增自减之后在参与 printf("%d %d %d %d\n", a++, ++a, ++a, a++); // 13 14 14 10 // 13 14 14 10
1.2、关系运算符
运算符 | 功能说明 | 举例 |
> | 大于 | a>b |
>= | 大于等于 | a>=5 |
小于 | a | |
小于等于 | a | |
== | 等于 | a==b |
!= | 不等于 | a!=b |
关注点:
1、关系运算符用于判断运算符两边的表达式是否满足给定的条件
2、关系运算符组成的表达式,称为关系表达式,其值为布尔类型,要么为真,要么为假
3、判断是否等于是双等号,而不是一个等号,一个等号代表的是赋值运算
当在写判断一个变量是狗等于另一个值得时候,最好把判断的这个常量放在比较的变量前面。
#include <stdio.h> int main(int argc, char const *argv[]) { int n; while(1) { scanf("%d", &n); if(10 == n)//需要注意不要写成 n = 10 { printf("恭喜你,猜对了\n"); break; } else if (n < 10) { printf("太小了,请从新输入\n"); } else if (n > 10) { printf("太大了,请从新输入\n"); } } return 0; }
在C语言中,规定,非0为真,0为假
练习:
1.3、逻辑运算符
运算符 | 功能说明 | 举例 |
&& | 逻辑与 | x>0&&y>0 |
|| | 逻辑或 | x>0||y |
! | 逻辑非(逻辑反) | !(x==1) |
1.3.1、运算规则
1、逻辑反:将逻辑真假翻转,真变假,假变真
2、逻辑与:将两个关系表达式串联起来,当左右两边的表达式都为真的时候,结果就为真。
3、逻辑或:将两个关系表达式串联起来,当左右两边任意一个表达式为真的时候,结果就为真。
1.3.2、特殊规则
1、在做逻辑与的时候,如果左边的表达式的结果为假,那么右边的表达式就不在执行了,相反,左边为真,右边要继续执行
2、在做逻辑或的时候,如果左边的表达式的结果为真,那么右边的表达式就不在执行了,相反,左边为假,右边要继续执行
3、
int a = 10;
int b = 20;
if(++a>10&&b++>19); 计算:a b 的值 a=11,b=21 a = 10; b = 20; i
f(a++>10&&++b>19); 计算:a b 的值 a=11,b=20 a = 10; b = 20;
if(a--<10||--b>19); 计算:a b 的值 a=9,b=19 a = 10; b = 20;
if(--a<10||b-->19); 计算:a b 的值 a=9,b=20
i
1.4、位运算符 *
运算符 | 名称 | 功能说明 | 举例 |
~ | 违反 | 将变量a的每一位取反 | ~a |
& | 位与 | 将变量a与变量b进行位与操作 | a&b |
| | 位或 | 将变量a与变量b进行位或操作 | a|b |
^ | 位异或 | 将变量a与变量b进行位异或操作 | a^b |
位左移 | 将变量a中的每一位进行左移 | a | |
>> | 位右移 | 将变量a中的每一位进行右移 | a>>4 |
进行位操作的时候,不管是操作十进制,八进制,十六进制,我们需要将操作的数字,转换成二进制之后,在进行位操作
正数:在计算机里面是直接按原码存储的,负数时按照补码存储的
原码:把这个数转成二进制
反码:原码取反
补码:反码+1
位反:
位与:
位或:
位异或:
位左移:
位右移
运算规则:总结
位逻辑与,或,反,拥有与逻辑运算符相似的规则和一样的真值表
位逻辑异或运算:相同为0,不同为1。(一个位跟某一位进行异或,与1异或,取反,与0异或,不变)
移位运算:左移时空出来的位置补0操作,左移的时候,移出去的数据不会丢弃,但是当超出数据本身的范围,就会将超出的数据丢弃。右移时空出来的位置,可以补0,可以不补,没有任何影响,右移出去的数据,就丢弃。(例外情况:如果做移位运算的操作数是一个有符号位的数(负号),在做右移的时候,移出去的不要,空出来的位补上原符号位)。
判断:
1.5、赋值运算符
1.5.1、简单赋值运算符=
1.不能对常量赋值,只能对变量赋值
2.不能对定义好的数组赋值,可以 对数组的某一个元素进行赋值
int a[3]; //a[3] = {1, 2, 3};//错误的 a[0] = 1; a[1] = 2; a[2] = 3; for (int i = 0; i < 3; ++i) { scanf("%d", &a[i]); }
3.可以连续进行赋值,顺序从右往左
int a, b, c; a = b = c = 0;
1.5.2、复合赋值运算(复杂)
当左右两边有相同操作数时,可以采用复合赋值运算符,不仅直观,且提高运行效率
除了C语言里面规定的复合赋值运算符之外,生造别的复合赋值运算符是非法的。
//加减乘除取余 a=a+10;//等价于a+=10; a=a-10;//等价于a-=10; a=a*10;//等价于a*=10; a=a/10;//等价于a/=10; a=a%10;//等价于a%=10; //位运算 a=a&10;//等价于a&=10; a=a|10;//等价于a|=10; a=a^10;//等价于a^=10; a=a<<10;//等价于a<<=10; a=a>>10;//等价于a>>=10; //a=a~10;//错的,~是单目运算符
1.6、内存存取运算符
[]:下标 arr[3] 得到数组arr下标为3的这一个元素
.:取成员 stu.name 得到结构体变量stu的成员那么的值
->:取成员 stu->name 得到结构体指针变量stu的成员那么的值
&:取地址 &a 得到变量a的地址
*:解引用 *p 得到地址p里面的数据
1.7、特殊运算符
1.7.1、三目运算符
?:
唯一一个需要三个操作数的运算符
语法:表达式1?表达式2:表达式3
释义:当表达式1成立,为真,执行表达式2,不成立,为假,执行表达式3
int a = 10; int b = 20; int c = a>b?a:b; printf("c = %d\n", c);
1.7.2、sizeof()运算符
含义:计算指定的数据类型的大小或者变量所占用的内存的字节个数
语法:sizeof(变量)、sizeof(数组)、sizeof(数据类型),计算变量,数组,数据类型所占用的字节数,计算变量时,sizeof后面的括号是可以省略的,但是,变量名和sizeof中间还是要用空格隔开。
int n = 10; printf("sizeof n = %ld\n", sizeof n); printf("sizeof(int) = %ld\n", sizeof(int));
1.7.3、return运算符
含义:退出某个函数(如果退出的函数是main函数,那么整个程序也就退出了)
语法:必须出现在函数体内,在退出的时候,可以带出函数对应的返回值类型的数据
1.7.4、()函数调用
调用函数的时候,在函数名的后面加上的括号,必加。
函数名([实际参数])
1.7.5、,逗号运算符
从左往右依次顺序进行运算,取整个表达式运算结果的最后一个表达式的值,为逗号表达式的值
int a = 100;
int b = 200;
int c;
c = (a+=10, b+=20, a++, a+100, b+a); //从左往右,中间只要在给变量赋值,那么最后采用的是更改之后的变量的值
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
2、优先级和结合性
当表达式中出现不同的运算符时,根据优先级来决定谁先执行,谁后执行,比如有加减乘除的时候,先乘车,后加减,有括号,先算括号里面的
当表达式中出现多个相同优先级的运算符时,根据运算符的结合性来决定谁先执行,谁后执行,比如加减运算的时候,从左往右运算