读书笔记(华科曹计昌 《c语言与程序设计》)

运行环境:

  win10

  codeBlocks 17.12版本

 

1:sizeof(给出一个数据类型或者数据对象的字节数)

  sizeof表达式有两种形式:

    -> sizeof(类型名)

    -> sizeof 表达式           。也可以写成sizeof(表达式)         

  sizeof的返回值为size_t类型,在头文件stddef.h中size_t定义为unsigned。

      int a,b;
      b = 3;
      printf("%u",sizeof a *b);//程序输出不为4,而是12.

    ->由于sizeof的返回类型为unsigned,所以使用%u。

    ->由于sizeof a 得到unsigned类型的4,在和b(=3)相乘得到12(unsigned类型)。

 

2: 逗号运算符

  表达式1,表达式2

  整个表达式的值和类型与表达式2的值和类型一致。

    x=(i=4,i%3);  //x=1,i=4。先执行了i=4,再执行i%3,整个(i=4,i%3)的值为1.

    x
=i=4,i%3;  //先执行x=i=4,再执行i%3。整个表达式的值为1,x=i=4。

 

3:位运算有趣例题1

  可以把21世纪日期的日月年三个整数压缩成一个16位的整数。写一个表达式,实现压缩存储日月年。

  分析:

    21世纪的年份,自然只需要后两位即可表示,日期不超过31,月份不超过十二,于是,对应着,各需要5位,4,位,5位来表示。

    因此表达式如下:day<<11 | month<<7 | year

4: 位运算有趣例题2

  简单加密示例。将一个短整型数x从高位向低分分别分成4个长度不等的部分,A(3位),B(5位),C(4位),D(4位)。

   然后将它们按照CADB排列,重新拼凑在一起。

 

  解答:

    我的思路如下:通过构造一个全1的16位short,然后使用移位从x中“切出”A\B\C\D。

      short x,a,b,c,d,max;
      max= (short)pow(2,16)-1;
      cin>>x;
    
      a = max<<13 & x;
      b = (max<<11)>>3 & x;
      c = (max<<12)>>8 & x;
      d = max>>12 & x;        

    这个思路没问题,只是实现方式太蠢。

    其实可以直接通过使用十六进制的数来得到如上的a\b\c\d。

        a = x & 0xE000;//此处注意0xE000是int类型,于是x & 0xE000自动转换成int类型,然后强制截断,赋值给a。
       b = x & 0x1F00;
       c = x & 0xF0;
       d = x & 0xF;

 

5:编写一个程序,读入一个字符,计算其奇偶校验位,并将其最高位设置为奇偶校验位。

  解答:

    我的做法如下:(采用偶校验:即偶数个1,上0,奇数个1,上1)

    char c;
    int sum;
    cin>>c;
    sum=0;
    for(int i=0;i<7;i++){//循环七次,依次取出各位,把各位加到sum上,再根据sum的奇偶性来判断第八位该上1还是上0。
        sum += (c>>i & 1);
        cout<<(c>>i & 1)<<endl;
    } 
    cout<<(sum%2<<7 | c)<<endl;

  tips:

    -> for(int i=0,sum=0;i<7;i++),如果写成这样,那相当于在for这个块内,又创立了一个同名sum。需要特别注意。

    

  教材上给的例子如下:

  

    unsigned char data,backup,t;
    int parity=0;

    data=getchar();
    backup =data;

    while(data){
        t = data & 1;
        parity ^=t;
        data>>=1;
    }

 

6: 打印整数各个二进制位。

void PrintBit(int x){
    int length = sizeof(x) * CHAR_BIT;//CHAR_BIT 包含在limits.h中。
    int mask = 1<<(length-1);
    for(int i =0;i<length;i++){
        putchar(x & mask ? '1':'0');
        x<<=1;
     if(!((i+1) % CHAR_BIT ) && i <length) printf(" "); //每八位分隔一下
  }
}

   tips:

      我把这段代码拷贝入codeBlocks时,出现如下错误:

    原因不明。总之我把出现红点的那行的空白字符都删掉,再重新按照舒服的方式用空白字符隔开的时候,报错消失了。

 

7:long long 类型(C99)

  长度至少64位,也分有无符号两种,即unsigned long long 和 long long 。

  后缀使用LL或者ll。

  标准c规定在printf中输出long long得使用%lld,在codeBlocks 17.12版本中也支持这样。

 

8: C99引入的真正的布尔类型_Bool。

  具体内容可以看https://blog.csdn.net/daheiantian/article/details/6241893

 

9:putchar

  原型为:int putchar(int c);

  把c转换为unsigned char类型,再送入标准输出设备中去。

  如果函数正确执行,则返回所输出的字符的字符码,否则返回EOF。

  

  int b = putchar('a');
    printf(" %d",b);

  输出结果为:a 97

 

10:EOF

  一般来说EOF定义为-1,但有的不是,所以为了代码的可移植性,需要使用EOF时,不要使用-1,而要使用EOF。

 

11:getchar

  原型为 int getchar(void)

    正确输入后,把输入字符转换为int类型后,作为函数的返回。

12:puts

  原型为 int puts(const char * s)

  -> s以\0作为字符串结束标志。

  -> puts正确执行时,返回一个非负整数值,否则返回EOF。

 

13:gets(c11被删除)

  原型为 char * gets(char *s)

  -> 读取一行输入,会自动把\n替换为\0作为结束符。

  -> 如果一行输入中包含空格的字符串,必须使用gets。

  -> 由于该函数隐含了编译器无法判断的安全隐患,c11里面删除了该函数,但在之前的编译器版本中还可以使用。

 

14:%f %g %e(printf格式化的输出)

    %f:输出小数形式的浮点数,小数部分六位数,多于六位,四舍五入,少于六位,则在末尾补零,保证刚好六位。

    %e: 输出标准形式的浮点数,尾数部分为六个有效数字,包括一个非零的整数部分以及五个小数部分。同样采用四舍五入和末尾补零的办法确保六个有效数字。

    %g: https://blog.csdn.net/Qsir/article/details/77930367

 

15: if else

  执行内层配对原则,即else与隔它最近的还没有配对的if配对。

posted @ 2019-07-09 23:26  奇婆子  阅读(320)  评论(0编辑  收藏  举报