• c语言学习笔记---符号


    专题2.符号的技巧:

    1) 注释符与转义符

           vC语言中的接续符()是指示编译器行为的利器:

          接续符的使用:编译器会将反斜杠剔除,嗯在反斜杠后面的字符自动解到前面的一行。

          在接续单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格,

          接续符适合在定义宏代码块时使用,

    2)单引号与双引号

    3)逻辑运算符使用分析:&与运算符,||或运算符,!非运算符.

          程序中的短路 ,短路规则:

          ||--从左向右计算,当遇到为真的条件时停止计算,整个表达式为真;所有条件为假时表达式才为假,

         &&从左向右开始计算,当遇到为假的的条件时停止计算,整个表达式为假;所有条件为真时表达式才为真。

         !运算符:!0=1,!1=0;!100=0,!-1000=0,

         C语言中的逻辑运算符”!”只认得0,只知道见了0就返回1,因此当起作用的值不是0时,其结果为0.

         三目运算符(a?b:c)可以作为逻辑运算符的载体,

    规则:当a的值为真时,返回b的值;否则返回c的值,

    4)位运算符分析:

          &按位与、|按位或、^按位异或、~取反、<<左移、>>右移。

          左移和右移注意点:

          左移运算符<<将运算数的二进制位左移,

     规则:高位丢弃,低位补零,

    右移运算符>>把运算数的二进制位右移,

    规则:高位补符号位,低位丢弃,

    注:补齐位的值,

    技巧:左移n位相当于乘以2的n次方,但效率比数学运算符高,

            右移n位相当于除以2的n次方,但效率比数学运算符高,

             ++,--操作符分析:

            贪心法:--  ++,-- 表达式的阅读技巧:

            编译器处理的每个符号应该尽可能多的包含字符,

           编译器以从左到右的顺序一个一个尽可能多的读入字符

           当即将读入的字符不可能和已读入的字符成合法为止,

          #include《sdtio.h>

          Int main ()

         {  Int i=0;  Int j=++i+++i+++i; -------贪心法:c语言编译器尽可能多的包含字符,++i是一个运算符结果是1,后再包含++时,就是1++,

         这时编译器认 为是erro,

         Int a=1; Int b=2;Int c=a+++b;运算方式:a++ 再次读到+,还能再读到b,这时a++是先赋予值后运算方式,所以a=1,在加上b=3,

         再次运算a++的”+”运算符=2,

         Int*p=6a;B =b/*p;运算方式:表达式b/*p.根据贪心法规则:从b字符再读到/,c语言认为是除法运算,还能再读把*都进去,c语言中的/*是注释符,

         /*之间加空格避免错错误,

        Return 0;

        }

    ++运算符运算方式:

        Int i=3;

        Int x=(++i)+(++i)+(++i);

        Printf=(“x=%d ”,x);

        Return 0;

       运算结果:16或18,

       值16运算方式:先运算前两个++i;运算中i加了两次,5+5=10,最后一个i加了一次,所以5+5+6=16;

       值18运算方式:三个i加了三次后i=6,所以6+6+6=18,

    逗号与++运算方式:

       Int x=3;

       Int K=(++x,x++,x+10);

       Printf(“k=%d ”,k);

       Return 0;

       运算结果:15;

    运算方式:从左到右顺序求值,之后最后一个表达式的值就是逗号表达式的值;

     ++x=4,x++=5,所以x+10=5+10=15;

    优先级和类型转换分析:

       .的优先级高于*,-.>操作符用于消除这个问题,[]高于*,函数()高于*,==和!=高于位操作,

       ==和!=高于赋予符,算术运算符高于位移运算符,逗号运算符在所有运算符中优先级最低,

       C语言隐式类型转换,

       算数运算式中,低类型转换为高类型,

       赋值表达式,表达式是的值转换左边变量的类型,

      函数调用时,实参转换为形的类型

      函数返回值,return 表达式转换为返回值类型,

      Char-àint àunsigned int àlongàunsigned longàdouble

      Char àshortàint àunsigned intàlong àunsigned long àdoubleàfloat

    5)预编译

      处理所有的注释,以空格代替,

      将所有的#define删除,并且展开所有的宏定义,

      处理条件编译指令#if,#ifdef,#elif,#else,#endif

      处理#include,展开呗包含的文件,

      保留编译器需要使用的#pragma指令,

      预处理指令:gcc-E file.c –o hello.i

      编译:

      对于处理文件进行一系列词法分析,语法分析和语义分析

      语法分析主要分析关键字,表示符,立即数是否合法,语法分析主要分析表达式是否遵循语法规则

      语义分析子啊语法分析的基础上进一步分析表达式是否合法

      分析结束后进行代码优化生成相应的汇编代码文件

      编译指令:gcc –s file.c –o hello.s

      汇编:汇编器将汇编代码转变为机器可以执行的指令,

      每个汇编句几乎都对应一条机器指令

      汇编指令:gcc –c file.s –o hello.o

      链接器的意义

      连接器的主要作用是各个模块之间相互引用的部分处理好,

      使得各个模块之间能够正确的衔接。

      模块拼装:  静态链接,(file1.o,file2.o,libc.a)-à链接器(linker)-àa.out

      动态链接:file1.cà编译器(gcc)àfile1.oà连接器(linker)àa.out

      Lib1.soàstub1à连接器(linker)àa.out

      Lib2.soàstub2à链接器(linker)àa.out

      编译器将编译工作主要分为预处理,编译和汇编三部

      连接器的工作是各个独立的模块链接为可执行程序,

      静态链接在编译期完成,动态链接在运行期完成,

    --已经完成---专题二

  • 相关阅读:
    【LCT维护基环内向树森林】BZOJ4764 弹飞大爷
    【LCT】BZOJ3091 城市旅行
    【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版
    【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅
    【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测
    【有上下界的网络流】ZOJ2341 Reactor Cooling(有上下界可行流)
    【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)
    从输入url到页面加载的过程
    forEach和map的区别
    理解 JavaScript 对象原型、原型链如何工作、如何向 prototype 属性添加新的方法。
  • 原文地址:https://www.cnblogs.com/dpf-learn/p/6106229.html
Copyright © 2020-2023  润新知