单目操作符
+:正值
-:负值
!:逻辑反操作
&:取地址
sizeof:求操作数的类型长度(以字节为单位)
~:按位取反(对一个数的二进制)
++:自增运算符
--:自减运算符
(类型):强制类型转换
-- -- -- -- -- -- -- -- -- --
逻辑反操作
#include <stdio.h>
int main()
{
int a = 0;
printf("%d\n",a);
printf("%d\n",!a);//逻辑反操作,0为假,非0为真
return 0;
}
运行结果:
0
1(其实只要非0就是真,但编译器运行后默认用1表示真)
若a=10,则!a=0
-- -- -- -- -- -- -- -- -- --
sizeof
sizeof(变量/类型)
计算的是变量/类型所占空间的大小,单位是字节
#include <stdio.h>
int main()
{
int a = 10;
printf("%d\n",sizeof(a));//括号里面放变量名
printf("%d\n",sizeof(int));//放类型名
printf("%d\n",sizeof a );//不写括号
//printf("%d\n",sizeof int );//上面三种写法都可以,唯独不能不写括号+类型名
return 0;
}
运行结果
4
4
4
-- -- -- -- -- --
sizeof(数组名)
sizeof(数组名)求的是整个数组的大小,单位是字节
#include <stdio.h>
int main()
{
int arr[10]={0};
//数组有十个元素,每个元素都是int类型
//10*sizeof(int)=10*4=40
printf("%d\n",sizeof(arr));
return 0;
}
运行结果:40
-- -- -- -- -- --
计算数组中的元素个数
#include <stdio.h>
int main()
{
int arr[10]={0};
int sz = 0;
sz=sizeof(arr)/sizeof(arr[0]);
//元素个数等于数组总大小/一个元素的大小
printf("%d\n",sz);
return 0;
}
运行结果:10
-- -- -- -- -- -- -- -- -- --
按位取反
猜一下下面代码运行的结果
#include <stdio.h>
int main()
{
int a = 0;
int b = ~a;//按位取反,按二进制位
printf("%d\n",b);
return 0;
}
运行结果:-1
是不是非常难以理解,解释前我们先简单了解一下符号位以及原码、反码、补码
-- -- -- -- -- --
符号位
int代表有符号的整型,unsigned int代表无符号整型。
-
有符号的整型二进制位的最高位表示的是符号位,最高位为1表示负数,为0表示正数
-
无符号的整型则是所有位都用来表示一个数
例:
a:101
若a无符号数,a是5
若a是有符号数,a是-1
-- -- -- -- -- --
原码、反码、补码
首先我们要知道,我们的整型数字在内存中存储的都是二进制的补码,但我们在使用、打印这个数的时候,使用的却是原码。
原码变成补码需要经过下面整些步骤:
原码:十进制的整数转换成一个二进制序列
原码—>反码:符号位不变,其他位按位取反,得到反码
反码—>补码:反码+1得到补码
-- -- -- -- -- --
回到题目
#include <stdio.h>
int main()
{
int a = 0;//4个字节,32个比特位
int b = ~a;//按位取反,按二进制位,0取反变成1,1取反变成0
//a:000000000000000000000000
//按位取反b:111111111111111111111111
//b是一个有符号的整型,二进制位的最高位表示的是符号位。是1,说明b是负数
//负数在内存中存储的时候,存储的是二进制位补码,打印时要用原码
//b补码:111111111111111111111111
//b反码:111111111111111111111110
//b原码:100000000000000000000001(从左往右,第一个1表示负数,最后一个1表示1)
printf("%d\n",b);//最终输出-1
return 0;
}
重点:只要是整数,内存中存储的都是二进制的补码。但是有符号数的正数和无符号数的原码、反码、补码相同
-- -- -- -- -- -- -- -- -- --
自增、自减运算符
++和--的使用方式是一样的,因此仅举例++
前置++
#include <stdio.h>
int main()
{
int a = 10;
int b = ++a;//前置++,先++,再使用
//++后a变成11,再赋给b,b也变成11
printf("a=%d b=%d\n",a,b);
return 0;
}
运行结果:a=11 b=11
-- -- -- -- -- --
后置++
#include <stdio.h>
int main()
{
int a = 10;
int b = a++;//后置++,先使用,再++
//所以先给b赋值,b就等于10,a再++变成11
printf("a=%d b=%d\n",a,b);
return 0;
}
运行结果:a=11 b=10
-- -- -- -- -- -- -- -- -- --
强制类型转换
#include <stdio.h>
int main()
{
int a = (int)3.14;//强制类型转换,double——>int
printf("%d\n",a);
return 0;
}
运行结果:3
-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
关系操作符
< <= > >= !=(用于测试不相等) ==(用于测试相等)
-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
逻辑操作符
&& ||
-- -- -- -- -- -- -- -- -- --
逻辑与:&&
有一个是假,结果为假,两个都是真才是真,可以用“并且”来理解
#include <stdio.h>
int main()
{
//真————非0
//假————0
int a = 3;
int b = 5;
int c = a&&b;//a,b两个都为真,c才能为真
printf("%d\n",c);
return 0;
}
运行结果:1
#include <stdio.h>
int main()
{
int i = 0;
int j = 10;
if (i && j)
{
printf("i&&j是真");
}
else
{
printf("i&&j是假");
}
return 0;
}
运行结果:i&&j是假
(因为i是0,即判断为假,有一个假就是假,此时编译器都不会再去判断j是不是真了,所以i&&j的结果是0。在if语句里0也是假,条件为假,执行else,所以打印“i&&j是假”)
-- -- -- -- -- -- -- -- -- --
逻辑或:||
有一个为真,结果为真,两个都是假才是假,可以用“或者”来理解
#include <stdio.h>
int main()
{
//真————非0
//假————0
int a = 0;
int b = 5;
int c = a||b;//a是假,b是真
printf("%d\n",c);
return 0;
}
运行结果:1
可以自己试试写一段程序来验证if(i || j)的结果
-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
条件操作符
exp1 ? exp2 : exp3
其中exp是表达式的意思,因为有三个操作数,所以又叫做三目操作符
含义:如果表达式1为真,则执行表达式2,否则执行表达式3
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int max = 0;
max=(a>b?a:b);//如果a>b,则max为a,显然a<b,所以max等于b,也就是20
printf("%d\n",max);
return 0;
}
运行结果:20
-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
逗号表达式
exp1,exp2,exp3...expN (用逗号隔开一串表达式)
逗号表达式的结果是最后一个表达式的结果
-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
下标引用、函数调用和结构成员
[ ] ( ) . ->
-- -- -- -- -- -- -- -- -- --
下标引用操作符
int main()
{
int arr[10] = {0};
arr[4];//[]————下标引用操作符,这里访问第五个元素
return 0;
}
函数调用操作符
#include <stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int a = 10;
int b = 20;
int sum = Add(a,b);//()————这就是函数调用操作符
printf("%d\n", sum);//会输出30
return 0;
}
附
操作符到这里就讲完了,更加详细的介绍会在后面的内容中提到。感兴趣或者想提前链接的可以看看这个链接