分类

算术操作符

移位操作符
针对二进制
<< >>
操作数只能是整数
左移规则:左边抛弃,右边补零
右移规则:分为两种
1.逻辑移位(左边用0填充,右边丢弃)
2.算术移位(左边用原该值符号位填充,右边丢弃

写法
int num=10;
num << 1
位操作符
&按位与、| 按位或、^ 按位异或
操作数必须为整数
二进制数

位操作符中 只有 ~ 是单目操作符,其他都是双目操作符
正数在内存中的原反补码相同
负数的原码得到反码(按位取反,符号位不变),反码得到补码(加1),反得到原码 (符号位不变按位取反再加1)
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for(i=0; i<32; i++)
{
if( num & (1 << i) )
count++;
}
printf("二进制中1的个数 = %d\n",count);
r
计算二进制中1的个数
在不使用第三个变量的情况下交换a b
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0; }
a^0=a
a^a=0
赋值操作符
左边不能是常数
int a = 10;
a = a + 2;
a += 2;
a = a >> 1;
a >>= 1;
a = a & 4;
a &= 4;
单目操作符

sizeof和数组
sizeof中的表达式不参与运算

#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0; }
(1)40 (2)4/8 (3)10(4)4/8

int b = ++a;//前置++,先++,后使用//a=a+1,b=a
int b = a++;//后置++,先使用,后++。//b=a,a=a+1
int b = --a;//前置--,先--,后使用 //a=a-1,b=a
int b = a--;//后置--,先使用,再-- //b=a,a=a-1
关系操作符

逻辑操作符






条件操作符
exp1 ? exp2 : exp3 ;
逗号表达式
从左向右执行,最后一个表达式是结果
a = get_val();
count_val(a);
while (a > 0)
{
a = get_val();
count_val(a);
}
如果使用逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
; //业务处理
}

实参个数为4
下标引用、函数调用和结构成员
【】操作数 一个数组名加值
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
[ ]的两个操作数是arr和9。
( )函数调用操作数
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //实用()作为函数调用操作符。
test2("hello bit.");//实用()作为函数调用操作符。
return 0;
}
访问结构成员
. ->
struct Stu
{
char name[20];
int age;
float score;
};
void print1(struct Stu ss)
{
printf("%s %d %f\n", ss.name, ss.age, ss.score);
}
//结构体变量.成员名
void print2(struct Stu* ps)
{
//printf("%s %d %f\n", (*ps).name, (*ps).age, (*ps).score);
printf("%s %d %f\n", ps->name, ps->age, ps->score);
}
//结构体指针->成员名
int main()
{
struct Stu s = {"张三", 20, 90.5f};
strcpy(s.name, "张三丰");
//scanf("%s", s.name);
*(s.name) = "张三丰"// err
print1(s);
print2(&s);
}


表达式求值

整型提升

按照数据类型的符号来提升,无符号数补0 有符号数补符号位
//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,高位补0

int main()
{
char c1 = 3;
//00000000000000000000000000000011
//00000011 - c1
char c2 = 127;
//00000000000000000000000001111111
//01111111 - c2
char c3 = c1 + c2;
//00000000000000000000000000000011
//00000000000000000000000001111111
//00000000000000000000000010000010
//10000010 - c3
//11111111111111111111111110000010
//11111111111111111111111110000001
//10000000000000000000000001111110
//-126
printf("%d\n", c3);//
//
return 0;
}
整型存在char中要截断,运算时要提升,打印时把补码换为原码,打印无符号数时默认该数就是正数不用换成原码。

算术转换
转换排行:越往上越先转换为上面的
long double
double
float
unsigned long int
long int
unsigned int
int
强制类型转换和自动类型转换请看以下链接
http://c.biancheng.net/view/1775.html
注意:当有符号转换为无符号数时,打印的时候也要用无符号%u


本文详细介绍了C语言中的位操作符,包括移位操作符(左移<<和右移>>)以及位操作符(按位与&、按位或|、按位异或^)。内容涵盖位操作符的规则、应用,如计算二进制中1的个数,以及如何在不使用额外变量的情况下交换两个数。此外,还讨论了算术操作符、赋值操作符、单目操作符如sizeof,以及关系操作符、逻辑操作符、条件操作符和表达式求值的相关概念。




892

被折叠的 条评论
为什么被折叠?



