复习C语言随笔 五

复习C语言随笔 五

几个需要注意的操作符

1 移位操作符

  • 1 左移操作符 <<
    高位丢弃,低位补0
  • 2 右移运算符 >>
    • 2.1 算术移位
      低位丢弃,高位补符号
    • 2.2 逻辑移位
      低位丢弃,高位补0

在实际中到时使用算数移位还是逻辑移位取决于编辑器

|Note: C语言中没有涉及位移量为负数的情况


2 位操作符

  • 1 按位与 &

  • 2 按位或 |

  • 3 按位异或 ^

#include
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<;
a = ~a;

4 sizeof

求字节数

#include
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

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;
} 

运行上述代码后会震惊地发现输出结果一致
!!!
复习C语言随笔 五_第1张图片

这是为什么呢?

事实上,对于计算机而言,数组 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
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,所以编译器会跳过后面的运算。

你可能感兴趣的:(C/C++,随笔,复习)