C语言提供了以下运算符:
(1)算术运算符 (+ - * / % ++ -- )
(2)关系运算符 (> < == >= <= ! =)
(3)逻辑运算符 ( !&& || )
(4)位运算符 (<< >> ~ | ^ &)
(5)赋值运算符 (=及其扩展赋值运算符)
(6)条件运算符 (?:)
(7)逗号运算符 ( , )
(8)指针运算符 ( * 和 & )
(9)求字节数运算符 ( size of )
(10)强制类型转换运算符 ( (类型))
(11)成员运算符 ( . ->)
(12)下标运算符 ( [ ] )
(13)其他 (函数调用运算符等)
接下来,会和大家一一介绍。
1.算术运算符
基本算术运算符(+ - * / %)
先讲讲最基本的算术操作符
运算符 | 含义 | 举例 | 结果 |
+ | 正号(单目运算符) | +a | a的值 |
- | 负号(单目运算符) | -a | a的算术负值 |
* | 乘法运算符号 | a*b | a和b的乘积 |
/ | 除法运算符 | a/b | a除以b的商 |
% | 求余运算符 | a%b | a除以b的余数 |
+ | 加法运算符 | a+b | a和b的和 |
- | 减法运算符 | a-b | a和b的差 |
#在C语言中,数学中的 乘号‘x’我们用 ‘*’代替。(ctrl +8)
#在C语言中,数学中的 除号‘➗’我们用 ‘/ ‘代替。
int main () { int a = 7; int b = 3; int c = a%b; return 0; }
%运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。
int main() { int a = 7; int b = 3; int c = a/b; return 0; }
结果:c = 2 两个整数相除的结果为整数,当两个实数相除时结果为双精度实数。
int main() { double a = 7; double b = 3.0; double c = a/b; return 0; }
自增(++)、自减(--)运算符
前置++
int main() { int a = 1; int b = ++a; return 0; }
当使用前置++时,为先++,后使用。先给a+1,然后在赋值给b。
结果:a=2,b=2
后置++
int main() { int a = 1; int b = a++; return 0; }
当使用后置++时,先使用,后加加。a的值会先赋值给b,然后a再加1。
结果:a=2,b=1
前置--
int main() { int a = 1; int b = --a; return 0; }
当使用前置--时,为先--,后使用。先给a-1,然后在赋值给b。
结果:a=0,b=0
后置--
int main() { int a = 1; int b = a--; return 0; }
当使用后置--时,先使用,后加加。a的值会先赋值给b,然后a再减1。
结果:a=0,b=1
2.关系运算符(> < == >= <= !=)
> 大于号
< 小于号
== 用来判断两个值大小是否相同(=为赋值符,给一个数赋值)
>= 大于等于
<= 小于等于
!= ’!‘为反逻辑,意思为不等于。
关系运算符一般用来比较大小。
#include <stdio.h> int main() { int a = 1; int b = 0; if(a>b) printf("%d\n",a); return 0; }
结果:1
#include <stdio.h> int main() { int a = 3; if(a!=0) printf("haha\n"); return 0; }
结果:haha
3.逻辑运算符 ( !&& || )
运算符 | 含义 | 举例 | 说明 |
&& | 逻辑与(and) | a&&b | 如果a和b都为真,则结果为真,否则为假 |
|| | 逻辑或(or) |
a || b | 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假 |
! | 逻辑非(not) | !a | 如果a为假,则!a为真,如果a为真,则!a为假 |
#在C语言中,0表示为假,非零表示为真。
#include <stdio.h> int main() { int a = 0; int b = 0; if(a&&b) printf("haha"); return 0; }
以上图为例
&& 只有左右两边的为真,结果才为真。一旦有一边为假,那么结果就为假。
a=1,b=2,a&&b 结果为真。
a=1,b=0, a&&b 结果为假。
a=0,b=2, a&&b 结果为假。
a=0,b=0, a&&b 结果为假。
|| 只有两边同时为假,结果才为假。一旦有一边为真,那么结果就为真。
a=1,b=2,a || b 结果为真。
a=1,b=0,a || b 结果为真。
a=0,b=2,a || b 结果为真。
a=0,b=0,a || b 结果为假。
! 逻辑非,输出的结果将会与实际结果相反。
#include <stdio.h> int main() { int a = 0; if(!a) printf("haha\n"); return 0; }
结果:haha
因为a的结果是0,那么a的相反就是非0,因此If语句判断为真。
当a=3时,a的相反就为0。那么if语句判断为假。就没有办法打印。
4.位运算符(<< >> ~ | ^ &)
&按位或 ||按位与 ^按位异或
都是按照二进制来进行操作的。
& : 按位与 只要有0,那么就为0。
a&b,将a和b的二进制数字相应的位数进行比较,只要有0,那么就为0。
int a = 3; int b = 5; int c = a&b; 二进制数: // 0 0 1 1 a // 0 1 0 1 b // 0 0 0 1 c
|| :按位或 只要有1,那么就为1。
a||b,将a和b的二进制数字相应的位数进行比较,只要有1,那么就为1。
int a = 3; int b = 5; int c = a||b; 二进制数: // 0 0 1 1 a // 0 1 0 1 b // 0 1 1 1 c
^ :按位异或 相同为0,相异为1.
a^b,将a和b的二进制数字相应的位数进行比较,相同为0,相异为1。
int a = 3; int b = 5; int c = a^b; 二进制数: // 0 0 1 1 a // 0 1 0 1 b // 0 1 1 0 c
~ 对一个数的二进制按位取反
~ :按位取反,1变成0,0变成1.
int b = 5; 二进制数字: // 0 1 0 1 ~b=10 // 1 0 1 0
<< 左移操作符 >> 右移操作符
<< : 将变量的二进制数字往左移动一位,左边的一位超过范畴舍去,右边缺少一位补0。
int a = 3; 二进制数字: // 0 0 1 1 <<3 = 6 // 0 1 1 0
0 0 1 1 -> (0) 0 1 1 0
<< : 将变量的二进制数字往右移动一位,右边的一位超过范畴舍去,左边缺少一位补0。
int a = 3; 二进制数字: // 0 0 1 1 >>3 = 1 // 0 0 0 1
0 0 1 1 -> 0 0 0 1 (1)
5.赋值运算符(=)
当你不喜欢某个值的时候就可以用等于号,来将这个值给变换。
#include<stdio.h> int main() { int weight = 200; //体重不喜欢,给自己赋一个喜欢的值 weight = 100; int salary = 10000;//工资不喜欢,给自己赋一个喜欢的值 salary = 20000; int hight = 160;/*身高不喜欢,给自己赋一个喜欢的值*/ hight = 180; printf("weight=%d,salary=%d,hight=%d\n",weight,salary,hight); return 0; }
结果:weight=100,salary=20000,hight=180
6.条件运算符(?:)
条件运算符又可以叫做三目运算符。因为它需要三个操作数。
表达式?表达式二:表达式三
表达式1表判断,如果表达式1为真的话。就会执行表达式2,如果表达式1为假的话,就会执行表达式3。
#include <stdio.h> int main() { int a = 4; int b = 5; a > b ? printf("%d\n", a) : printf("%d\n", b); return 0; }
这里就是比大小,当a>b的时候就会执行表达式2,打印出a的值。如果a<b的话,那就会执行表达式3,打印b的值。
条件运算符适用于那些表达式比较简单的,如果表达式比较复杂的话,就要考虑使用if语句。
7.逗号表达式(,)
逗号表达式就是用逗号隔开的多个表达式。
从左到右依次计算。最后算出的结果是最后一个表达式的结果。
int main() { int a = 4; int b = 5; int c = 6; b =( ++a, 6, ++c); return 0; }
结果:a=5,b=7,c=7.
8.指针运算符(*和&)
* 又可以叫间接访问操作符(解引用操作符)
*常常与指针伴随使用。
int main() { int a = 10; int* p = &a; *p = 20; printf("%d\n",a); return 0; }
p被赋予a的地址,即p为指针,*p可以通过地址来使用a或者直接改变a的值。
&取地址操作符,可以取一个变量的地址。
int main() { int a = 10; printf("%d\n",&a); return 0; }
结果:0x010ffcc0
就是a的地址。
9.求字节数运算符(sizeof)
sizeof是用来计算变量所占内存的大小,或者是类型所创造的变量占据空间的大小。
int main() { char arr[10] = { 0 }; int tmp[10] = { 0 }; printf("%d\n", sizeof arr); printf("%d\n", sizeof tmp); return 0; }
int 整形的一个变量的大小为4个字节,而char 字符类型所产生的一个变量的所占内存大小为1个字节,因此
结果:10
40
10.强制类型转换运算符(类型)
可以利用强制类型转换运算符将一个表达符将一个表达式转换成所需类型。
int main() { int a = 3.14; printf("%d\n", a); return 0; }
这样的程序最后会报出警告,但是在msvc中依旧能打印结果'3'。
11.成员运算符(-> .)
ps->age=20;//为定义结构体成员。 ps.age//为使用结构体成员
->和. 是成员运算符,两者的不同点在于一个用来使用,一个用来定义,
ps->age=20;
=(*ps).age=20;
12.下标运算符([ ])
int arr[10] = {0,1,2,3,4,5,6,7,8,9}; //arr[7] = {7};
其中的[]就是下标引用操作符,而arr和7就是操作数,我们在调用数组时,可以:
printf("%d\n",7[arr] );
这样的写法也是对的,但是不符合我们的习惯。
但是在定义的时候我们不能使用:
int 10[arr]={0};
这样的写法是错的。
13.其他(函数调用操作符)
int c = Add(a,b);
这里的()就是函数引用操作符,而Add,a,b就是操作数。