• 读书笔记(华科曹计昌 《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中“切出”ABCD。

          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;        

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

        其实可以直接通过使用十六进制的数来得到如上的acd。

            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以作为字符串结束标志。

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

    13:gets(c11被删除)

      原型为 char * gets(char *s)

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

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

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

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

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

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

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

    15: if else

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

  • 相关阅读:
    Text box to accept only number
    两个经典的Oracle触发器示例
    ELK部署
    Win10+CentOS7双系统引导修复
    自定义多选框(checkbox)和单选框(radio)css样式
    js事件
    js数组与字符串处理 slice、splice、substring、substr、push、pop、shift、reverse、sort、join、split
    css入门基础
    cocos2dx基础篇(7) 触碰事件
    cocos2dx基础篇(6) 定时器schedule/update
  • 原文地址:https://www.cnblogs.com/cq0143/p/11161207.html
Copyright © 2020-2023  润新知