复习C语言随笔 五
几个需要注意的操作符
1 移位操作符
- 1 左移操作符 <<
高位丢弃,低位补0 - 2 右移运算符 >>
- 2.1 算术移位
低位丢弃,高位补符号 - 2.2 逻辑移位
低位丢弃,高位补0
- 2.1 算术移位
在实际中到时使用算数移位还是逻辑移位取决于编辑器
|Note: C语言中没有涉及位移量为负数的情况
2 位操作符
1 按位与 &
2 按位或 |
3 按位异或 ^
#include<stdio.h>
int main(){
int a = -12;
int b = 20;
a = a^b;
printf("a=%d b=%d\n", a, b);
b = a^b;
printf("a=%d b=%d\n", a, b);
a = a^b;
printf("a=%d b=%d\n", a, b);
return 0;
}
|Note:按位,即按二进制位。它们的操作数必须是整数。 灵活运用这三个操作符可以极大方便运算,例如:按位与可以实现对特定位置零、按位或可以实现对特定位置1、按位异或可以实现对特定位取反等等。
3 ~ 按位取反
想要对一个二进制数的第n位进行置零操作时,要先生成一个“过滤筛”来筛选出相应位,即生成一个 11111111…111011111111… 二进制序列。
通过生成的二进制序列与二进制数相与的到想要的位。
可以利用 ~ 运算符生成一个符合需求的二进制序列,方法如下:
a = 1<<n;
a = ~a;
4 sizeof
求字节数
#include<stdio.h>
int main(){
short int a = 10;
int b = 0;
printf("%d\n",sizeof(b)); //4
printf("%d\n", sizeof(a = b + 1)); //2
printf("%d\n",a); //10
return 0;
}
|sizeof运算符中的表达式不参与运算,但参与类型转换
5 []
#include<stdio.h>
int main(){
int a[5]={1,2,3,4,5}, i;
for(i=0; i<sizeof(a)/sizeof(a[0]); i++)
{
printf("%d ",a[i]);
}
printf("\n");
for(i=0; i<sizeof(a)/sizeof(a[0]); i++)
{
printf("%d ",i[a]);
}
return 0;
}
运行上述代码后会震惊地发现输出结果一致
!!!
这是为什么呢?
事实上,对于计算机而言,数组 a[i] 就是 *(a+i),
而 (a+i) == (i+a) ,翻译为i[a]。
输出输入格式
- 1 %p 输出指针
- 2 %o 八进制
- 3 %x 十六进制,大于9的数字用小写字母表示
- 4 %X 十六进制,大于9的数字用大写字母表示
- 5 %u 无符号的十进制
- 6 %d 十进制
- 7 %c 字符
- 8 %s 字符串
- 9 %f 浮点
- 10 %e 以指数形式输出实数
- 11 %g 根据大小自动选择 %f 或 %e ,且不输出无意义的0
数组地址
sizeof(数组名) 和 &数组名 代表数组, 除此之外所有的数组名的出现方式都代表数组的首地址
一个例题
#include<stdio.h>
int main(){
int i=0, a=0, b=1, c=3, d=4;
i = a++ && ++b && d++;
printf("i=%d a=%d b=%d c=%d d=%d",i, a, b, c, d);
return 0;
}
输出结果为:
i=0 a=1 b=1 c=3 d=4
原因在于 a++ 时,逻辑为0,可知整个表达式为0,所以直接跳过了后面的与逻辑运算,i=0。
若将 a 的 初值改为1,则输出结果为:
i=1 a=2 b=2 c=3 d=5
同理,或运算符也一样,当表达式中已经有了逻辑1,则整个结果必然为1,所以编译器会跳过后面的运算。