1、算术操作符
算术操作符包括+ - * / %
(加、减、乘、除、取模/取余)
#include <stdio.h>
//操作符
int main()
{
int a = 9 / 2;
printf("%d\n",a);
return 0;
}
将语句int a = 9 / 2;printf("%d\n",a);
改为float a = 9 / 2; printf("%f\n",a);
,运行结果从4变为4.000000,始终算不出来4.5,因为C语言中的除法只计算商,不计算余数,也不会算出小数。所以9/2=4,若想要求出精确的结果,可以将除号两端任意一个数字改为小数,就可以得到准确结果了。
2、位移操作符
位移操作符包括<<(左移)
和>>(右移)
int main()
{
int a = 2;
int b = a << 1;
printf("%d\n",b);
return 0;
}
运行结果为4.因为左移操作符移动的是二进制位。a=2----》表示为二进制是10,由于a是存放到整型里面的,整型所占的内存大小是4个字节,4个字节是32个比特位,所以:
左移一位之后,最左边的0丢失,在最右边补零,变为
00000000 00000000 00000000 00000100,表示为十进制为4。(左移时,最后一位永远补零)
3、位操作符
位操作符包括按位与&
、按位或|
、按位异或^
4、赋值操作符
赋值操作符包括:= += -= *= /= &= ^= |= >>= <<=
5、单目操作符
! | 逻辑反操作 |
---|---|
- | 负值 |
+ | 正值 |
& | 取地址 |
* | 间接访问操作符(解引用操作符) |
sizeof | 操作符的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
– | 前置、后置– |
++ | 前置、后置++ |
类型 | 强制类型转换 |
说明:对于“a+b”来说,“+”有2个操作数,故为双目操作符;单目操作符只有一个操作数。
(1)逻辑反操作
在C语言中有规定:0表示假,非0就是真。
int main()
{
int a = 10;
printf("%d\n",!a);
return 0;
}
运行结果为:0.因为10为真,故!10为假,所以运行结果为0.
int main()
{
int a = 0;
printf("%d\n",!a);
return 0;
}
运行结果为1.当把假变成真的时候,真的数有很多,规定结果为1.
“!”的真正用法是:
int main()
{
if (a)
{
//当a为真,要执行什么操作
}
if (!a)
{
//当a为假,又要执行什么操作
}
return 0;
}
(2)sizeof是一个操作符,用来计算变量或类型的大小。
int main()
{
int a = 10;
printf("%d\n",sizeof(int));
printf("%d\n", sizeof(a));
return 0;
}
运行的结果都是4,因为a的类型是int类型。
printf("%d\n", sizeof(a));
中sizeof后面的括号可以省略,意味着sizeof是操作符,不是函数。但是函数后面的括号是不可以省略的。sizeof求变量的话,括号可以省略,但求类型的时候,括号不可以省略,如:sizeof(int)
。 可是在通常情况下,使用sizeof的时候,括号都不省略。
思考:sizeof是否能计算数组的大小呢?
int main()
{
int arr[10] = { 0 };
printf("%d\n",sizeof(arr));
printf("%d\n", sizeof(arr[0]));
int sz = sizeof(arr) / sizeof(arr[0]);//计算元素个数
printf("%d\n",sz);
return 0;
}
运行结果为:
40
4
10
因为定义的数组是包含10个0元素的数组,而这10个0零元素每一个都是一个int类型,每个int类型都是4个字节,所以对于整个数组来说,它的长度就是10x4等于40个。对于数组中的第一个元素来说,它的长度是4个字节。
(3)按位取反
“~”为按位取反,按二进制位取反,将所有的二进制位都取反,1变为0,0变为1.
int main()
{
int a = 0;
printf("%d\n",~a);
return 0;
}
运行结果为:-1
对于正整数来说,其原码、补码、反码都是一样的。
(4)前置++、后置++
int main()
{
int a = 10;
int b = ++a;//前置++:先++,后使用
printf("%d\n",a);
printf("%d\n", b);
return 0;
}
运行结果为:
11
11
前置++:先让a执行++操作,然后再将此时a的值赋给b
,所以运行结果均为11
int main()
{
int a = 10;
int b = a++;//后置++:先使用,后++
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
运行结果为:
10
11
后置++:先把a的值赋给b,然后a再执行++操作。
(5)括号里面放入类型–》“(类型)”为强制类型转换
int main()
{
int a = 3.14;
printf("%d\n",a);
return 0;
}
运行该程序的时候,虽然不会报错,但是会警告:warning C4244: “初始化”: 从“double”转换到“int”,可能丢失数据
将int a = 3.14;
改为int a = (int)3.14;
即可正确运行。
6、关系操作符
关系操作符包括:> >= < <= !=(用作测试“不相等”) ==(用作测试“相等”)
7、逻辑操作符
逻辑操作符包括&&(逻辑与)、||(逻辑或)
int main()
{
int a = 3;
int b = 5;
int c = a && b;
printf("%d\n",c);
return 0;
}
运行结果为:1,因为3与5都是真,所以两者作“逻辑与”操作的结果也是真。
若将b=5改为b=0,则结果为0
将int c = a && b;
改为int c = a|| b;
,则运行结果仍为1.
8、条件操作符(三目操作符)
exp1?exp2:exp3
,意为exp1成立,则计算exp2,整个表达式的结果是exp2的结果;若exp1不成立,则整个表达式的结果是exp3的结果。
int main()
{
int a = 0;
int b = 3;
int max = 0;
if (a > b)
max = a;
else
max = b;
printf("%d\n", max);
return 0;
}
这段代码中的if else结构就可以写作:
max = a > b ? a : b;
9、逗号表达式
逗号表达式是用逗号隔开的一段表达式exp1,exp2,...,expN
,逗号表达式的特点是会从左向右依次计算,整个逗号表达式的结果是最后一个表达式的结果。
int main()
{
int a = 0;
int b = 3;
int c = 5;
int d = (a = b + 2, c = a - 4,b=c+2);
printf("%d\n",d);
return 0;
}
运行结果为a3.运行完此段代码之后,a=3+2=5;c=5-4=1;b=c+2=1+2=3
10、下标引用、函数调用和结构成员
[] () . ->
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[5]);
return 0;
}
这段代码中的arr[5]的方括号就是下标引用操作符。
再有就是在调用函数的时候,函数名后边的()就是函数调用操作符,比如printf("hello\n")