一、算术操作符
10年积累的做网站、网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有南明免费网站建设让你可以放心的选择与我们合作。+、-、*、/、%
(1)希望 / 结果是浮点数, 分子或分母必须有一个是浮点数。
(2)% 不能用于浮点数。
二、移位操作符
<< 左移操作符
>> 右移操作符
1.整数的二进制表示3种:
(1)原码
(2)反码
(3)补码
注:
a、正整数的原、反、补码相同;
b、负整数的原、反、补码需要计算。
c、对于有符号(signed)数来说,二进制数的第一位是符号位。0代表正数,1代表负数;
d、整数在内存中以补码的形式存在。
e、但是打印出来的值是以原码的形式打印的;
f、反码求原码两种方法:先取反
g、 右移共有两种,一种是算术右移,一种是逻辑右移;
算术右移:右边丢弃,左边补原符号位;
逻辑右移:右边丢弃,左边补0;
而右移是哪种右移,取决于编译器。
h、移动的位数不能是负数:如,a>>-1是错的。
例:int a = 5;(32位操作系统)
原码:00000000000000000000000000000101
反码:00000000000000000000000000000101
补码:00000000000000000000000000000101
int b = -5;
原码:10000000000000000000000000000101
反码:111111111111111111111111111111111010(符号位不变,其他位取反)
补码:111111111111111111111111111111111011(反码+1)
2.移位
左移:
a<<1;移动a的补码;
左移前:00000000000000000000000000000101
左移后:00000000000000000000000000001010(左边丢弃,右边补0)
b<<1;移动b的补码
左移前:111111111111111111111111111111111011
左移后:111111111111111111111111111111110110
反码:111111111111111111111111111111110101
原码:10000000000000000000000000001010
右移:(算术右移)
a>>1;
右移前:00000000000000000000000000000101
右移后:00000000000000000000000000000010
b>>1;
右移前:111111111111111111111111111111111011
右移后:111111111111111111111111111111111101
三、位操作符
& //按位与
| //按位或
^ //按位异或
操作数必须是整数。
&: 每个数的二进制补码进行运算,只要有一个数为0则为0,两个数都为1,才是1.
|: 只要有一个数为1,则为1,两个数都是0 才是0;
^: 相同为0,相异为1,0与任何数异或都是那个数本身,两个相同的数异或为0。
例 1:
不能创建临时变量(第三个变量),实现两个数的交换
方法一:(此方法问题,当a+b的和过大,超过int的范围时,则会导致数据的丢失)
#includeint main()
{
int a=3;
int b=5;
printf("a=%d b=%d",a,b);
a=a+b;
b=a-b;
a=a-b;
printf("a=%d b=%d",a,b);
return 0;
}
方法二、
#includeint main()
{
int a=3;
int b=5;
printf("a=%d b=%d",a,b);
a=a^b;//(1)
b=a^b;//(2)
a=a^b;//(3)
printf("a=%d b=%d",a,b);
return 0;
}
解释:
由异或的性质,两个相同的数异或结果为0;
那么a=a^b;
第二个式子b=a^b; 可以看做 b=a^b^b,(两个相同的数异或结果为0),得b=2;
第三个式子a=a^b;联立式1和式二;可得a=a^b^a,解得a=b;
例 2:
求一个整数在内存中存储的二进制形式有几个1。
方法一、
#includeint main()
{
int n=0;
scanf("%d",&n);
int i=0;
int count=0;
for(i=0;i<32;i++)
{
if((n>>i)&1==1)
{
count++;
}
}
printf("%d\n",count);
return 0;
}
四、赋值操作符
=、+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
五、单目操作符
! 逻辑反操作 ->真变假,假变真->0为假,非0真。 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置 -- ++ 前置、后置 ++ * 间接访问操作符 ( 解引用操作符 ) ( 类型 ) 强制类型转换
sizeof: a、是操作符不是函数;b、如果求变量的大小,可省去(),是类型不可省去;c、sizeof(s=a+3);括号中的表达式不参与运算,出来后s的值不变;
例: ~ 的应用
int a=11;
//此时二进制为
//00000000000000000000000000001011
//想要将第三位的0变成1;
//将第三位或一个1即可
//00000000000000000000000000000100
a |= 4;
//而4是1向左移动两位得来的,即
a |= (1<<2);
//此时又想将或之后的数变回去,此时的二进制数是
//00000000000000000000000000001111
//要想将第三位变回0,需要与一个0,即
//11111111111111111111111111111011
//上边的数又是通过4取反得来的,即
//00000000000000000000000000000100取反,代码为:
a |= (~(1<<2));
注:
a、C语言在C99之前无表示真假的类型,C99中引用了布尔类型
六、关系操作符
if("abcdefg"=="ahbhgh")
此时 == 比较的是两个数组首字母的地址。
七、逻辑操作符
&&、||
#includeint main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
该代码的输出结果是1 2 3 4;
因为a++是先使用后++,但最初a=0,而&&运算符当有一个是0 时,就不继续运算了。
如果改为 || 的话,如果有一个为真,后边的就不继续计算了。
八、下标引用、函数调用和结构成员
下标引用
arr[4] 等价于 *(arr+4) 等价于 4[arr]
九、表达式求值(重要!)
表达式求值的顺序一部分是由操作符的优先级和结合性决定; 有些表达式的操作数在求值的过程中可能需要转换为其他类型。1.隐式类型转换
整形提升:表达式中的字符和短整型操作数在使用之前被转换为普通整型。
整形提升的方法:
int main()
{
char c1=3;
//3是一个整型数字,二进制序列为:
//00000000000000000000000000000011
//但存储到char类型的变量中会发生截断,即
//00000011(在c1中的存储)
char c2=127;
//127二进制序列为:
//000000000000000000000000001111111
//截断
//01111111
char c3 = c1 + c2;
//在计算时,需要再次将c1与c2进行整型提升,提升为int类型,即
//c1: 00000000000000000000000000000011
//c2: 000000000000000000000000001111111
//相加得:00000000000000000000000001000010
//再次存入到char类型的c3中为
//1000010(此时最高位1 是符号位)
printf("%d\n",c3);
//printf()打印是看的是原码;
//c3进行整形提升,即:(对于有符号数,提升时补符号位)
//1111111111111111111111111000010
//转成原码:
//1000000000000000000001111101
//结果为:126
}
2.算数转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。3.操作符的属性
(1)优先级
(2)结合性
(3)是否控制求值顺序
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站标题:【C语言初阶】五、操作符详解-创新互联
标题链接:http://lswzjz.com/article/eddhc.html