引言
C语言的操作符其实是比较多的,正是因为有了这些操作符才使得C语言更加的灵活和完善,但是注意,该篇的学习笔记并不是操作符认知教程,仅适合操作符有大概了解的同学,请酌情观看。
正文
除法操作符的两个操作数都是整数的话,执行的是整数除法
除法操作符的两个操作数只要有一个浮点数,执行的是小数除法
取模操作符的操作数必须是整数
移位操作符移动的是二进制的位 数据的二进制表示
<< 左移操作符 >> 右移操作符
整数的二进制表示形式有3种:原码,反码,补码。
原码:把一个数按照正负直接翻译成二进制就是原码
正整数的原码,反码,补码是相同的。
负整数的原码,反码,补码是要计算的
反码:原码的符号位不变,其他位按位取反就是反码
补码:反码+1
例如-5:
10000000000000000000000000000101 - 原码
11111111111111111111111111111010 - 反码
11111111111111111111111111111011 - 补码
整数在内存中存储的是:补码
右移操作符:算术右移,逻辑右移
算术右移:右边丢弃,左边用原来的符号位来填充
逻辑右移:右边丢弃,左边直接用0填充
位操作符 位是二进制位
按位异或 - 对应的二进制位,相同为0,相异为1
不创建临时变量,实现两个数的交换
~ 对一个数的二进制按位取反
sizeof单独放数组名计算整个数组大小
&& || 逻辑与 逻辑或只关注真假
||左边为真不再计算
&&左边为假不再计算
,运算符:取最后一个表达式的值作为逗号表达式运算的结果
优先级:从高到低顺序是:++ 、 = 、 ,
浮点数不能左移右移操作符
[]是下标引用操作符
函数调用操作符()
结构成员访问操作符
对照代码:
//int main()
//{
// int a = 3;
// int b = -5;
// int c = a & b;
// return 0;
//}
//按位异或 - 对应的二进制位,相同为0,相异为1
//不创建临时变量,实现两个数的交换
//a^a=0
//0^a=a
//3^3^5=5
//3^5^3=5
//int main()
//{
// int a = 3;
// int b = 5;
// /*a = a + b;
// b = a - b;
// a = a - b;*/
// a = a ^ b;
// b = a ^ b;
// a = a ^ b;
// return 0;
//}
//int main()
//{
// int a = 10;
// printf("%d\n", sizeof(a));
// printf("%d\n", sizeof(int));
// return 0;
//}
// ~ 对一个数的二进制按位取反
//sizeof单独放数组名计算整个数组大小
//&& || 逻辑与 逻辑或只关注真假
//int main()
//{
// int i = 0, a = 0, b = 2, c = 3, d = 4;
// i = a++ && ++b && d++;
// //i=a++||++b||d++
// printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d);
// return 0;
//}
//||左边为真不再计算
//&&左边为假不再计算
//,运算符:取最后一个表达式的值作为逗号表达式运算的结果
//优先级:从高到低顺序是:++ 、 = 、 ,
//浮点数不能左移右移操作符
//int main()
//{
// int a, n, b, i;
// scanf_s("%d", &a);
// for (i = 0; i < 32; i++)
// {
// if (a & (i >> 1))
// {
// b++;
// }
// }
// printf("%d", b);
// return 0;
//}
//int main()
//{
// int x = 0;
// int y = 0;
// int count = 0;
// scanf("%d %d", &x, &y);
//
// for (int i = 0; i < 32; i++)
// {
// if (((x >> i) & 1) != ((y >> i) & 1))
// {
// count++;
// }
// }
// printf("%d", count);
//
// return 0;
//}
[]是下标引用操作符
函数调用操作符()
结构成员访问操作符
int main()
{
int len = strlen("abc");//()
printf("%d", len);
return 0;
}
struct S
{
int num;
char c;
};
void test(struct S* ps)
{
printf("%d\n", (*ps).num);
printf("%c\n", (*ps).c);
//-> 结构成员访问操作符
//结构体指针->结构体成员
printf("%d\n", ps->num);
printf("%c\n", ps->c);
}
int main()
{
struct S s = { 100,'b' };//结构体的初始化使用{}
//打印结构中的成员数据
printf("%d\n", s.num);
printf("%c\n", s.c);
// . 操作符 结构体变量.结构体成员名
return 0;
}
表达式求值
隐式类型转换
整形提升
按照变量的数据类型的符号位来提升
无符号提升直接补零
int main()
{
char a = 3;
//00000000000000000000000000000011
//00000011 -截断
char b = 127;
//00000000000000000000000001111111
char c = a + b;
//00000000000000000000000000000011
//00000000000000000000000001111111
//00000000000000000000000010000010
//10000010
printf("%d", c);
//11111111111111111111111110000010
//11111111111111111111111110000001
//-126
return 0;
}