C语言中有许多不同类型的操作符,它们用于执行各种操作,包括算术运算、关系运算、逻辑运算、赋值操作以及位操作等。以下是一些常见的C语言操作符。
一、算数操作符
作用:执行数学运算。
+:加法
-:减法
*:乘法
/:除法
%:取模(取余数)
例子:
除法运算中,若被除数和除数都为int,则商也为int。若被除数和除数有一个为浮点型,则商为浮点型。
取模运算中,需要两个数同为int,且模的正负看被除数的符号。
二、赋值操作符
在C语言中,赋值操作符用于将一个值赋给一个变量。赋值操作符允许你更新或修改变量的值,而且它们也返回赋值后的值。以下是C语言中常见的赋值操作符:
=、+=、-+、*=、/=、%=、<<=、>>=、&=、|=、^=
用法如下:
//a=a+b;
//a+=b;
三、单目操作符
!逻辑反操作
int main()
{
int a = 5;
if (!a)
printf("yeah");
else
printf("oh");
return 0;
}
输出结果:oh,说明!a为0
++ --递增、递减
& *
*:解引用操作符(间接访问操作符)
&和*用于指针当中
int main()
{
int a = 10;
int* pa = &a;
//*pa是解引用操作符(间接访问操作符)通过pa中存放的地址,找到指向的空间(内容)
return 0;
}
sizeof()
不是函数,是单目操作符
计算的结果类型是size_t,size_t是一种无符号的整数,打印时用%zd
计算结果(返回值)的单位是字节
int main()
{
int arr[10];
printf("%d\n", sizeof(arr));//40 - 计算整个数组的大小,字节单位
printf("%d\n", sizeof(arr[0]));//4 - 计算数组中元素的大小,字节单位
printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 - 数组元素个数
}
~
按补码二进制位取反
(类型)
:用于强制类转换
int a = (int)3.14;
printf("%d", a);//3
四、关系操作符
< > <= >= == !=
返回的结果为0或1
五、逻辑操作符
&&逻辑与
||逻辑或
!逻辑取反
短路现象:
&&——左0,右不用算了
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
//a=2
//b=3
//c=3
//d=5
||——左1,右不用算了
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
//a=2
//b=2
//c=3
//d=4
六、条件操作符
exp1?exp2:exp3(三目操作符)
exp1真——执行exp2
exp1假——执行exp3
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d", a > b ? a : b);
}
输出结果:a、b之间较大的数
若输入为5 9,则输出为9
七、位移操作符
<< 左移操作符
>> 右移操作符
注:位移操作符只能是整数,移动的是二进制位数,这里涉及到了整数的二级制表现形式(即原码、反码和补码)。
原码、反码和补码
1.正整数的原码、反码、补码是一样的
2.负整数的原码、反码、补码需要计算
1个整型占4个字节,即32bit位
符号位
int a=15;
原码:
正数:符号位是0
负数:符号位是1
举个例子简单说明一下:
int main()
{
int a = 15;
//00000000000000000000000000001111 - 原码
//00000000000000000000000000001111 - 反码
//00000000000000000000000000001111 - 补码
int b = -15;
//10000000000000000000000000001111 - 原码
//11111111111111111111111111110000 - 反码(原码符号不变,按位取反)
//11111111111111111111111111110001 - 补码(反码+1)
//整数在内存中存储的是补码
//计算的时候也是使用补码计算
return 0;
}
知道了什么是二进制的原码、反码和补码后就可以进行位移操作了。
右移>>
算术右移(右边丢弃,左边补原来的符号位)
逻辑右移(右边丢弃,左边直接补0)
C语言中没有明确规定是算术右移还是逻辑右移,一般编译器上采用的是算术右移
左移<<
:左边丢弃,右边补0
八、位操作符
& 按位与
int main()
{
int a = 3;
//00000000000000000000000000000011 - 补码
int b = -5;
//10000000000000000000000000000101 - 原码
//11111111111111111111111111111010 - 反码
//11111111111111111111111111111011 - 补码
int c = a & b;
//& 有0则为0,同时为1,才是1
//00000000000000000000000000000011 - 补码(正数即原码)
printf("%d\n", c);//3
return 0;
}
| 按位或
int main()
{
int a = 3;
//00000000000000000000000000000011 - 补码
int b = -5;
//10000000000000000000000000000101 - 原码
//11111111111111111111111111111010 - 反码
//11111111111111111111111111111011 - 补码
int c = a | b;
//| 有1则为1,同时为0,才是0
//11111111111111111111111111111011 - 补码
//11111111111111111111111111111010 - 反码
//10000000000000000000000000000101 - 原码
printf("%d\n", c);//-5
return 0;
}
^ 按位异或
int main()
{
int a = 3;
//00000000000000000000000000000011 - 补码
int b = -5;
//10000000000000000000000000000101 - 原码
//11111111111111111111111111111010 - 反码
//11111111111111111111111111111011 - 补码
int c = a ^ b;
//^ 相同为0,相异为1
//11111111111111111111111111111000 - 补码
//11111111111111111111111111110111 - 反码
//10000000000000000000000000001000 - 原码
printf("%d\n", c);//-8
return 0;
}
异或支持交换律
九、逗号表达式
exp1,exp2,exp3,...expN
逗号表达式,就是用逗号隔开的多个表达式,(从左向右执行)整个表达式的最后结果为最后一个表达式的结果
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("a=%d\nb=%d\nc=%d\n",a, b, c);
输出结果:a=12
b=13
c=13
十、下标引用、函数调用和结构成员
数组下标引用:[]
int arr[10] = { 1,2,3,4,5 };
printf("%d", arr[3]);//4
操作数是:arr和3
函数调用:()
int len = strlen("abc");//()函数调用操作符
printf("%d\n", len);
操作数是:strlen和“abc”
访问结构成员:. ->
struct Book
{
char name[30];
char author[30];
float price;
};
int main()
{
struct Book b1 = { "C","谭",66.6f };//书
struct Book b2 = { "数据结构","张",88.8f };//书
printf("%s %s %f\n", b1.name, b1.author, b1.price);
//谭 C 66.599998
}
结构体变量.成员名
struct Book
{
char name[30];
char author[30];
float price;
};
void Price(struct Book* p)
{
printf("%s %s %f\n", p->author, p->name, p->price);
}
int main()
{
struct Book b1 = { "C","谭",66.6f };//书
struct Book b2 = { "数据结构","张",88.8f };//书
Price(&b1);//谭 C 66.599998
Price(&b2);//张 数据结构 88.800003
}
结构指针->成员名