精华内容
下载资源
问答
  • 想问的是关于C语言符号表的问题,如 int i=3 是局部变量。那么可不可以这么理解: i本质上是代表一个地址的,以后的代码中操作i变量的时候,实质上操作的是i代表的地址中的内容,而内存在这个地址中存放的数据是3....
  • C语言符号、指令

    2012-09-26 20:55:27
    C语言符号、指令基础 C语言符号、指令表C语言符号、指令
  • c语言符号 指令

    2014-04-09 11:31:34
    C语言中有许多符号及指令,为系统学习,将其整理,是学习C语言必备!
  • C语言指令表与符号表

    2018-08-21 17:14:44
    C语言指令表与符号表 编译指令 编译指令 说明 #include 包含另一个文件 #define 定义一个宏(macro)或是常量 #undef 取消一个宏常量的定义 #asm和#endasm 在程序中加入汇编语言的程序 #ifdef、#ifndef、#else、#...
  • c语言的符号指令 编译指令 基本数据类型 用户定义数据类型格式 保留字 常量表示法 算术运算 比较运算 逻辑运算 位逻辑运算 if语句 嵌套if语句 switch语句 for循环 while循环...汇编语言 宏定义 c语言符号控制命令
  • C语言 符号优先级

    2013-05-28 14:20:27
    优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 ...(表达式)/函数名(形参)   . 成员选择(对象) 对象.成员名

    优先级

    运算符

    名称或含义

    使用形式

    结合方向

    说明

    1

    []

    数组下标

    数组名[常量表达式]

    左到右

     

    ()

    圆括号

    (表达式)/函数名(形参表)

     

    .

    成员选择(对象)

    对象.成员名

     

    ->

    成员选择(指针)

    对象指针->成员名

     

    2

    -

    负号运算符

    -表达式

    右到左

    单目运算符

    (类型)

    强制类型转换

    (数据类型)表达式

     

    ++

    自增运算符

    ++变量名/变量名++

    单目运算符

    --

    自减运算符

    --变量名/变量名--

    单目运算符

    *

    取值运算符

    *指针变量

    单目运算符

    &

    取地址运算符

    &变量名

    单目运算符

    !

    逻辑非运算符

    !表达式

    单目运算符

    ~

    按位取反运算符

    ~表达式

    单目运算符

    sizeof

    长度运算符

    sizeof(表达式)

     

    3

    /

    表达式/表达式

    左到右

    双目运算符

    *

    表达式*表达式

    双目运算符

    %

    余数(取模)

    整型表达式/整型表达式

    双目运算符

    4

    +

    表达式+表达式

    左到右

    双目运算符

    -

    表达式-表达式

    双目运算符

    5

    <<

    左移

    变量<<表达式

    左到右

    双目运算符

    >>

    右移

    变量>>表达式

    双目运算符

    6

    >

    大于

    表达式>表达式

    左到右

    双目运算符

    >=

    大于等于

    表达式>=表达式

    双目运算符

    <

    小于

    表达式<表达式

    双目运算符

    <=

    小于等于

    表达式<=表达式

    双目运算符

    7

    ==

    等于

    表达式==表达式

    左到右

    双目运算符

    !=

    不等于

    表达式!= 表达式

    双目运算符

    8

    &

    按位与

    表达式&表达式

    左到右

    双目运算符

    9

    ^

    按位异或

    表达式^表达式

    左到右

    双目运算符

    10

    |

    按位或

    表达式|表达式

    左到右

    双目运算符

    11

    &&

    逻辑与

    表达式&&表达式

    左到右

    双目运算符

    12

    ||

    逻辑或

    表达式||表达式

    左到右

    双目运算符

    13

    ?:

    条件运算符

    表达式1? 表达式2: 表达式3

    右到左

    三目运算符

    14

    =

    赋值运算符

    变量=表达式

    右到左

     

    /=

    除后赋值

    变量/=表达式

     

    *=

    乘后赋值

    变量*=表达式

     

    %=

    取模后赋值

    变量%=表达式

     

    +=

    加后赋值

    变量+=表达式

     

    -=

    减后赋值

    变量-=表达式

     

    <<=

    左移后赋值

    变量<<=表达式

     

    >>=

    右移后赋值

    变量>>=表达式

     

    &=

    按位与后赋值

    变量&=表达式

     

    ^=

    按位异或后赋值

    变量^=表达式

     

    |=

    按位或后赋值

    变量|=表达式

     

    15

    ,

    逗号运算符

    表达式,表达式,…

    左到右

    从左向右顺序运算

    说明:

    同一优先级的运算符,运算次序由结合方向所决定。

    简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符


    本文转自:http://www.slyar.com/blog/c-operator-priority.html



    展开全文
  • 编译指令 编 译指令 说 明 #i n c l u d e 包 含 另 一 个 文 件 #d e f i n e 定 义 一 个 宏 macr o) 或是常量 # u n d ef 取 消 一 T 宏 常 量的 定 义 #a s m和 #e nd a s m 在 程 序 中 加 入 汇编 语 言的程序...
  • C语言符号控制命令

    千次阅读 2015-09-23 14:51:32
    符号长整数常量 结尾加上 UL 327800UL 浮点数的常量 结尾加上 F 4.234F 字符常量 以单引号括起来 ‘a’ ...

    编译指令

    编译指令

    说明

    #include

    包含另一个文件

    #define

    定义一个宏(macro)或是常量

    #undef

    取消一个宏常量的定义

    #asm#endasm

    在程序中加入汇编语言的程序

    #ifdef#ifndef#else#endif

    用于条件式的编译

    注解//—单行注解;

    基本数据类型 int,float,double,char,void

    数据类型

    类型说明

    长度(位)

    数据长度

    bit

    1

    01

    char

    字符

    8

    128~127

    unsigned char

    无符号字符

    8

    0~255

    signed char

    有符号字符

    8

    128~127

    int

    整型

    16

    32768~32767

    short int

    短整型

    16

    32768~32767

    unsigned int

    无符号整型

    16

    0~65535

    signed int

    有符号整型

    16

    32768~32767

    long int

    长整型

    32

    2147483648~2147483647

    unsigned long int

    无符号长整型

    32

    0~4294967295

    signed long int

    有符号长整形

    32

    2147483648~2147483647

    float

    浮点数(实数)

    32

    0.175e-38~0.402e38

    double

    双精度浮点

    32

    0.175e-38~0.402e38

    void

    0

    没任何数据

    用户自定义数据类型格式

    typedef struct{

    数据类型      变量序列1;

    数据类型      变量序列1;

    ...

    }自定义数据类型的名称;

    保留字

    _at_,alien,bdata,break,bit,case,char,code,compact,const,continue,data,

    default,do,double,far,else,enum,extern,float,for,goto,if,funcused,idata,int,

    inline,interrupt,large,long,pdata,_priority_,reentrant,return,sbit,sfr,sfr16,

    short,sigend,sizeof,small,static,struct,switchc_task_,typedef,using,union,

    unsigned,void,volatile,while,xdata

     

     

     

     

     

     

    常量表示法

    常数

    规则

    范例

    十进制

    一般十进制格式

    1234567890

    二进制

    开头加上0b

    0b00001110

    八进制

    开头加上O

    O0123

    十六进制

    开头加上0x

    0xFF45

    无符号整数常量

    结尾加上U

    30000U

    长整数常量

    结尾加上L

    299L

    无符号长整数常量

    结尾加上UL

    327800UL

    浮点数的常量

    结尾加上F

    4.234F

    字符常量

    以单引号括起来

    ‘a’

    字符串常量

    以双引号括起来

    “hello”

    -----------------------------------------------------运算符-----------------------------------------------------

    算术运算

    运算符

    说明

    范例

    执行结果

    +

    c=a+b

    c 等于10

    d=ab

    d 等于6

    *

    e=a*b

    e 等于16

    /

    f=a/b

    f 等于4

    %

    取余数

    g=a%b

    g 等于0

    ++

    1

    c++相当于c=c+1

    c 等于11

    ——

    1

    d——;相当于d=d1

    d 等于5

    =

    等于

    a=8

    设置a等于8

    +=

    先相加在等于

    e+=5;相当于e=e+5

    e 等于21

    =

    先相减在等于

    f=5;相当于f=f5

    f 等于—1

    *=

    先相乘在等于

    b*=5;相当于b=b*5

    b 等于0

    /=

    先相除在等于

    a/=5;相当于a=a/5

    a 等于1

    %=

    先取余数在等于

    a%=5;相当于a=a%5

    a 等于3

    假设a等于8b等于2

    比较运算

    运算符

    说明

    范例

    执行结果

    ==

    等于

    a==5

    F

    =

    不等于

    a!=5

    T

    <<o:p> 

    小于

    a<5

    F

    大于

    a>5

    T

    <=

    小于等于

    a<=5

    F

    >=

    大于等于

    a>=5

    T

    比较运算结果是个布尔值既TRUE(真值)FALSE(假值)。假设a等于8

     

     

     

     

    逻辑运算

    运算符

    说明

    范例

    执行结果

    &&

    AND

    (a>5)&&(a<10)

    T

    ||

    OR

    (a<5)||(a>10)

    F

    !

    NOT

    !(a>10)

    T

    逻辑运算结果是个布尔值既TRUE(真值)FALSE(假值)。假设a等于8

    位逻辑运算

    运算符

    说明

    范例

    执行结果

    &

    AND

    a&0x01

    a等于1

    |

    OR

    a|0x80

    a等于0x85

    ~

    NOT

    ~a

    a等于0xFA

    ^

    XOR

    a^0xFF

    a等于0xFA

    << 

    左移

    a<<1

    a等于0x0A

    >> 

    右移

    a>>1

    a等于0x0A

    假设a等于5

    ----------------------------------------------------控制命令---------------------------------------------------

    if语句

    if(条件) 语句1;

       else   语句2;

    例:if(d==4) d=0;     //如果d等于4就设置d等于0

    else d++;     //否则就将d1

       if(ticks==0) {    //如果ticks等于0

    ticks=1000;   //ticks 设置成1000

    counter[0]++;  //counter[0]1

       }

     

    嵌套if语句

    例:if(counter[0]==10) {

    counter[1]++;

    counter[0]=0;

    if(counter[1]==10) {

      counter[2]++;

      counter[1]=0;

    }

    }

     

    switch语句

    switch (变量) {

       case 常量1:语句1; break;

       case 常量2:语句2; break;

       case 常量3:语句3; break;

       ......

       default ; 语句n;

    }

    for循环

    for (初值,条件,变化值) 语句;

    例:for(i=0;i<10;i++) x=x+i;

       for(i=1;i<10,i++)

    for(j=1;j<10,j++)

      printf(“%d %d”,i,j);

    无穷循环:

    for( ; ; );

     

    while循环

    while (条件) 语句;

    例:while (ch!=!’A’) ch=getche();

       无穷循环:

       while(1);

     

    do/while循环

    do {

    语句;

    ...

    while(条件);

    例:do {

       ch=getche();

    while (ch!=”A”);

     

    goto语句

    loop1:

    x++;

    if(x<100) goto loop1;

    ----------------------------------------------------指针和函数------------------------------------------------

    指针的定义

    数据类型     *指针变量的名字;

    例: char     *p;

    int      *x;

     

    指针与数组

    例: char        filename[80];

    char        *p;

    p=filename;               //指针p存放filename的开始地址

     

    int          x[5]={1,2,3,4,5};

    int          *p,sum,i;

    p=x;                     //指针p存放数组x的开始地址

    for(i=0;i<5;i++)

       sum=sum+p[i];         //p[i]相当于x[i]

     

     

    指针的运算

    1.针变量前面加上*号就是取得指针所指向位置的内容。

    例:int     x[5]={1,2,3,4,5};

    int     *p;

    p=x;           //指针p存放数组x的开始地址

    *p=10;           //相当于设置x[0]等于10

    2.变量前面加上&符号,可以取得一个变量的位置。

    例:int      x,y;

        int      *p;

        p=&x;           //指针p存放x的地址,相当于p是指向x 的指针

        *p=1;           //相当于设置x等于1

    3.&符号也可以加在数组的前面

    例:int        x[5];

        int        *p;

        p=&x[2];           //指针p存放x[2]的地址,相当于p是指向x[2]的指针

        *p=50;             //相当于设置x[2]等于50

    函数

    函数类型    函数名称(参数序列);

    参数说明

    {

            函数的主体

    }

    例:void delay (void) {       //不返回任何数据的函数

    unsigned char i,j;       //没有任何参数的函数

      for(i=0,i<255,i++)

         for(j=0,j<255,j++);

    }

    main()

    {

     ...

     delay();             //调用函数

    }

    例:unsigned char sum(unsigned chat a,unsigned chat b)

    {

      unsigned chat x;

      check_GLCD_busyflag();     //函数中可以调用另一个函数

      x=a+b;

      return x;                 //return会返回x的数据

     }

    中断服务函数

    void 中断服务程序的名(void) interrupt 中断号码using 寄存器组号码

    {

    中断服务子程序主体

    }

     

     

     

    中断号码

    #define IE0_VECTOR    0   //0x03

    #define TF0_VECTOR    1   //0x0B

    #define IE1_VECTOR    2   //0x13

    #define TF1_VECTOR    3   //0x1B

    #define SIO_VECTOR    4   //0x23

    对于S51有定时器2

    #define TF2_VECTOR    5   //0x2B

    例:static void xint0_isr(void) interrupt IE0_VECTOR(或0 using 1

    {

      unsigned char i,j=0xFF;

      for(i=0,i<16,i++)

        {

          j++;

          P1=j;        //将数值输出到P1

          delay_4isr();

        }

     }

    -----------------------------------------------------汇编语言--------------------------------------------------

    C中加入汇编语言

    例:void delay100us()

    {

     #pragma asm

            mov   r7,#1

     more:   mov   r3,#48

            djnz   r3,$

            djnz   r7,more

     #pragma endasm

    }

    ----------------------------------------------------宏(macro----------------------------------------------

    宏的定义

    %*define (macro名称) (macro的指令)

    例:%*define (write_1) (

    setb DI

    serb SK

    clr  SK

    )

     

    #define 宏的名称 宏的指令

    例:#define uchar unsigned char

     

     

     

    C语言中的符号总结

    运算符的种类C语言的运算符可分为以下几类;

    1. 算术运算符

     用于各类数值运算,包括加减乘除求余自增自减共七种运算

     {  +  ,( - ),(*  ,( /  , % ),( ++ ),(-- }

    2. 关系运算符

     用于比较运算,包括大于(>),小于(<</span>),等于(==),大于等于(>=),

     小于等于(<=),不等于(!=)共六种。

    3.逻辑运算符

     用于逻辑运算,包括与(&&)(||)(!)三种.

    4.位操作运算符

     参与运算的量,按二进制位进行运算,包括:

     位与(&),位或(|),位非(~),为异或(^,左移(<<),右移(>>)共六种。

    5.赋值运算符

     用于赋值运算,分为:

     简单赋值(=

     复合算术赋值(+=-=,*=,/=%=

     复合位运算赋值(&=|=^=>>=<<=)三类共十一种。

    6.条件运算符

     这是一个三目运算符,用于条件求值(?:)。

    7.逗号运算符

     用于把若干表达式组合成一个表达式(,)。

    8.指针运算符

     用于取内容(*)和取地址(&)两种运算。

    9.求字节数运算符

     用于计算数据类型所占用的字节数(sizeof)。

    10.特殊运算符

      有括号(),下标[],成员(→, .

     

    1.C的数据类型

    基本类型,构造类型,指针类型,空类型

    2.基本类型的分类及特点

    类型说明符      字节       数值范围

    字符型char        1        C字符集

    基本整型int       2        -3276832767

    短整型short int     2         -3276832767

    长整型 long int     4      -214783648214783647

    无符号型 unsigned    2        065535

    无符号长整型 unsigned long 4      04294967295

    单精度实型 float    4       3/4E-383/4E+38

    双精度实型 double   8       1/7E-3081/7E+308

    3.常量后缀

    Ll 长整型

    Uu 无符号数

    Ff 浮点数

    4.常量类型

    整数,长整数,无符号数,浮点数,字符,字符串,符号常数,转义字符。

    5.数据类型转换

    a自动转换

    在不同类型数据的混合运算中,由系统自动实现转换, 由少字节类型向多字节类型转换。 不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左边的类型。

    b强制转换

    由强制转换运算符完成转换。

    6.运算符优先级和结合性

    一般而言,单目运算符优先级较高,赋值运算符优先级低。 算术运算符优先级较高,关系和逻辑运算符优先级较低。 多数运算符具有左结合性,单目运算符、三目运算符、 赋值

    7.表达式

    表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类型。 表达式求值按运算符的优先级和结合性所规定的顺序进行。

     

    表示输出类型的格式字符       格式字符意义

    d                 以十进制形式输出带符号整数(正数不输出符号)

    o                 以八进制形式输出无符号整数(不输出前缀O)

    x                 以十六进制形式输出无符号整数(不输出前缀OX)

    u                 以十进制形式输出无符号整数

    f                 以小数形式输出单、双精度实数

    e                 以指数形式输出单、双精度实数

    g                 %f%e中较短的输出宽度输出单、双精度实数

    c                 输出单个字符

    s                 输出字符串

    标志字符为-+#、空格四种,其意义下表所示:

    标志格式字符         

    -          结果左对齐,右边填空格

    +          输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号

    #          csdu类无影响;对o类, 在输出时加前

    o         x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点

    格式字符串

     

    格式字符串的一般形式为: %[*][输入数据宽度][长度]类型 其中有方括号[]的项为任选项。各项的意义如下:

    1.类型

    表示输入数据的类型,其格式符和意义下表所示。

    格式    字符意义

    d     输入十进制整数

    o     输入八进制整数

    x     输入十六进制整数

    u     输入无符号十进制整数

    fe    输入实型数(用小数形式或指数形式)

    c     输入单个字符

    s     输入字符串

    转义字符

    转义字符是一种特殊的字符常量。转义字符以反斜线”\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各例题printf函数的格式串中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。

    常用的转义字符及其含义

    转义字符  转义字符的意义

    \n      回车换行

    \t      横向跳到下一制表位置

    \v      竖向跳格

    \b      退格

    \r      回车

    \f      走纸换页

    \\      反斜线符”\

    \      单引号符

    \a      鸣铃

    \ddd     13位八进制数所代表的字符

    \xhh     12位十六进制数所代表的字符

    广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表2.2中的\ddd\xhh正是为此而提出的。dddhh分别为八进制和十六进制的ASCII代码。如\101表示字?quot;A \102表示字母”B”,\134表示反斜线,\XOA表示换行等。转义字符的使用

    C语言中,对变量的存储类型说明有以下四种:

    auto     自动变量

    register   寄存器变量

    extern    外部变量

    static    静态变量

      自动变量和寄存器变量属于动态存储方式, 外部变量和静态变量属于静态存储方式。在介绍了变量的存储类型之后, 可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型。 因此变量说明的完整形式应为: 存储类型说明符 数据类型说明符 变量名,变量名…; 例如:

    static int a,b;           说明a,b为静态类型变量

    auto char c1,c2;          说明c1,c2为自动字符变量

    static int a[5]={1,2,3,4,5};    说明a为静整型数组

    extern int x,y;           说明x,y为外部整型变量

    与指针有关的各种说明和意义见下表。

    int *p;     p为指向整型量的指针变量

    int *p[n];   p为指针数组,由n个指向整型量的指针元素组成。

    int (*p)[n];  p为指向整型二维数组的指针变量,二维数组的列数为n

    int *p()    p为返回指针值的函数,该指针指向整型量

    int (*p)()   p为指向函数的指针,该函数返回整型量

    int **p     p为一个指向另一指针的指针变量,该指针指向一个整型量。

     

    指针变量的赋值

    p可以有以下两种方式:

    (1)指针变量初始化的方法 int a;

    int *p=&a;

    (2)赋值语句的方法 int a;

    int *p;

    p=&a;

     

    (1)取地址运算符&

    (2)取内容运算符*

     

    展开全文
  • C语言指令、符号表

    2012-01-13 00:56:38
    C语言符号控制命令,编译指令,常量表示法,运算符,控制命令,指针和函数
  • C语言符号

    千次阅读 2012-12-05 14:03:50
    C语言运算符的优先级 一、运算符的优先级 C 语言的符号众多,由这些符号又组合成了各种各样的运算符。既然是运算符就一定有其特定的优先级,下就是C 语言运算符的优先级: 注:同一优先级的...

    C语言运算符的优先级

    一、运算符的优先级表

    C 语言的符号众多,由这些符号又组合成了各种各样的运算符。既然是运算符就一定有其特定的优先级,下表就是C 语言运算符的优先级表:
    注:同一优先级的运算符,运算次序由结合方向所决定。

    上表不容易记住。其实也用不着死记,用得多,看得多自然就记得了。也有人说不用记这些东西,只要记住乘除法的优先级比加减法高就行了,别的地方一律加上括号。这在你自己写代码的时候,确实可以,但如果是你去阅读和理解别人的代码呢?别人不一定都加上括号了吧?所以,记住这个表,我个人认为还是很有必要的。

    二、一些容易出错的优先级问题

    上表中,优先级同为1 的几种运算符如果同时出现,那怎么确定表达式的优先级呢?这是很多初学者迷糊的地方。下表就整理了这些容易出错的情况:

    这些容易出错的情况,希望读者好好在编译器上调试调试,这样印象会深一些。一定要多调试,光靠看代码,水平是很难提上来的。调试代码才是最长水平的。


    2/(-2)的值是多少?

    除法运算在小学就掌握了的,这里还要讨论什么呢?别急,先计算下面这个例子:

    2/(-2)的值为多少?2%(-2)的值呢?如果与你想象的结果不一致,不要惊讶。我们先看看下面这些规则:
    假定我们让a 除以b,商为q,余数为r:
       q = a/b;
       r = a%b;
    这里不妨先假定b 大于0。

    我们希望a、b、q、r 之间维持什么样的关系呢?
    1,最重要的一点,我们希望q*b + r == a,因为这是定义余数的关系。
    2,如果我们改变a 的正负号,我们希望q 的符号也随之改变,但q 的绝对值不会变。
    3,当b>0 时,我们希望保证r>=0 且r<b。

    这三条性质是我们认为整数除法和余数操作所应该具备的。但是,很不幸,它们不可能同时成立。

    先考虑一个简单的例子:3/2,商为1,余数也为1。此时,第一条性质得到了满足。好,把例子稍微改写一下:(-3)/2 的值应该是多少呢?如果要满足第二条性质,答案应该是-1。但是,如果是这样,余数就必定是-1,这样第三条性质就无法满足了。如果我们首先满足第三条性质,即余数是1,这种情况下根据第一条性质,商应该为-2,那么第二条性质又无法满足了。

    上面的矛盾似乎无法解决。因此,C 语言或者其他语言在实现整数除法截断运算时,必须放弃上述三条性质中的至少一条。大多数编程语言选择了放弃第三条,而改为要求余数与被除数的正负号相同。这样性质1 和性质2 就可以得到满足。大多数C 语言编译器也都是如此。

    但是,C 语言的定义只保证了性质1,以及当a>=0 且b>0 时,保证|r|<|b|以及r>=0。后面部分的保证与性质2 或性质3 比较起来,限制性要弱得多。通过上面的解释,你是否能准确算出2/(-2)和2%(-2)的值呢?


    C语言++、--操作符

    这绝对是一对让人头疼的兄弟。先来点简单的:
       int i = 3;
       (++i)+(++i)+(++i);
    表达式的值为多少?15 吗?16 吗?18 吗?其实对于这种情况,C语言标准并没有作出规定。有点编译器计算出来为18,因为i 经过3 次自加后变为6,然后3 个6 相加得18;而有的编译器计算出来为16(比如Visual C++6.0),先计算前两个i 的和,这时候i 自加两次,2 个i 的和为10,然后再加上第三次自加的i 得16。其实这些没有必要辩论,用到哪个编译器写句代码测试就行了。但不会计算出15 的结果来的。

    ++、--作为前缀,我们知道是先自加或自减,然后再做别的运算;但是作为后缀时,到底什么时候自加、自减?这是很多初学者迷糊的地方。假设i=0,看例子:
    A)
    j =(i++,i++,i++);

    B)
    for(i=0;i<10;i++)
    {
       //code
    }

    C)
    k = (i++)+ (i++)+ (i++);

    你可以试着计算他们的结果。
    A) 例子为逗号表达式,i 在遇到每个逗号后,认为本计算单位已经结束,i 这时候自加。关于逗号表达式与“++”或“--”的连用,还有一个比较好的例子:
    int x;
    int i = 3;
    x = (++i, i++, i+10);

    问x 的值为多少?i 的值为多少?
    按照上面的讲解,可以很清楚的知道,逗号表达式中,i 在遇到每个逗号后,认为本计算单位已经结束,i 这时候自加。所以,本例子计算完后,i的值为5,x的值为15。
    B) 例子i 与10 进行比较之后,认为本计算单位已经结束,i 这时候自加。
    C) 例子i 遇到分号才认为本计算单位已经结束,i 这时候自加。
    也就是说后缀运算是在本计算单位计算结束之后再自加或自减。C 语言里的计算单位大体分为以上3 类。

    留一个问题:
    for(i=0,printf(“First=%d”,i);
    i<10,printf(“Second=%d”,i);
    i++,printf(“Third=%d”,i))
    {
       printf(“Fourth=%d”,i);
    }
    打印出什么结果?

    一、++i+++i+++i

    上面的例子很简单,那我们把括号去掉看看:
    int i = 3;
    ++i+++i+++i;
    天啦!这到底是什么东西?好,我们先看看这个:a+++b 和下面哪个表达式想当:
    A)
    a++ +b;

    B)a+ ++b;

    二、贪心法

    C 语言有这样一个规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理的策略被称为“贪心法”。需要注意到是,除了字符串与字符常量,符号的中间不能嵌有空白(空格、制表符、换行符等)。比如:==是单个符号,而= =是两个等号。

    按照这个规则可能很轻松的判断a+++b 表达式与a++ +b 一致。那++i+++i+++i;会被解析成什么样子呢?希望读者好好研究研究。另外还可以考虑一下这个表达式的意思:a+++++b;


    C语言花括号{}

    花括号每个人都见过,很简单吧。但曾经有一个学生问过我如下问题:
       char a[10] = {“abcde”};
    他不理解为什么这个表达式正确。我让他继续改一下这个例子:
       char a[10] { = “abcde”};
    问他这样行不行。那读者以为呢?为什么?

    花括号的作用是什么呢?我们平时写函数,if、while、for、switch 语句等都用到了它,但有时又省略掉了它。简单来说花括号的作用就是打包。你想想以前用花括号是不是为了把一些语句或代码打个包包起来,使之形成一个整体,并与外界绝缘。这样理解的话,上面的问题就不是问题了。


    C语言位运算符

    C 语言中位运算包括下面几种:
    1. & 按位与
    2. | 按位或
    3. ^ 按位异或
    4. ~ 取反
    5. << 左移
    6. >> 右移
    前4 种操作很简单,一般不会出错。但要注意按位运算符|和&与逻辑运算符||和&&完全是两码事,别混淆了。其中按位异或操作可以实现不用第三个临时变量交换两个变量的值:
       a ^= b; b ^= a;a ^= b;但并不推荐这么做,因为这样的代码读起来很费劲。

    一、左移和右移

    1. 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
    2. 右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。但注意:对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0;而为负数时,符号位为1,最高位是补0 或是补1 取决于编译系统的规定。Turbo C 和很多系统规定为补1。

    二、0x01<<2+3 的值为多少?

    再看看下面的例子:
       0x01<<2+3;
    结果为7 吗?测试一下。结果为32?别惊讶,32 才是正确答案。因为“+”号的优先级比移位运算符的优先级高(关于运算符的优先级,我并不想在这里做过多的讨论,你几乎可以在任何一本C 语言书上找到)。好,在32 位系统下,再把这个例子改写一下:
       0x01<<2+30;或0x01<<2-3;
    这样行吗?不行。一个整型数长度为32 位,左移32 位发生了什么事情?溢出!左移-1位呢?反过来移?所以,左移和右移的位数是有讲究的。左移和右移的位数不能大于数据的长度,不能小于0。


    C语言逻辑运算符||和&

    ||和&&是我们经常用到的逻辑运算符,与按位运算符|和&是两码事。下一节会介绍按位运算符。虽然简单,但毕竟容易犯错。看例子:
    int i=0;
    int j=0;
    if((++i>0)||(++j>0))
    {
       //打印出i 和j 的值。
    }
    结果:i=1;j=0。

    不要惊讶。逻辑运算符||两边的条件只要有一个为真,其结果就为真;只要有一个结果为假,其结果就为假。if((++i>0)||(++j>0))语句中,先计算(++i>0),发现其结果为真,后面的(++j>0)便不再计算。同样&&运算符也要注意这种情况。这是很容易出错的地方,希望读者注意。


    C语言单引号、双引号

    我们知道双引号引起来的都是字符串常量,单引号引起来的都是字符常量。但初学者还是容易弄错这两点。比如:‘a’和“a”完全不一样,在内存里前者占1 个byte,后者占2个byte。关于字符串常量在指针与数组那章将有更多的讨论。

    这两个列子还好理解,再看看这三个:
       1,‘1‘,“1”。
    第一个是整形常数,32 位系统下占4 个byte;
    第二个是字符常量,占1 个byte;
    第三个是字符串常量,占2 个byte。

    三者表示的意义完全不一样,所占的内存大小也不一样,初学者往往弄错。字符在内存里是以ASCAII 码存储的,所以字符常量可以与整形常量或变量进行运算。如:‘A‘ + 1。


    C语言接续符和转义符

    C 语言里以反斜杠(\)表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。当然你可以测试一下加了空格之后的效果。我们看看下面的例子:

    //这是一条合法的\
    单行注释
    /\
    /这是一条合法的单行注释
    #def\
    ine MAC\
    RO 这是一条合法的\
    宏定义
    cha\
    r* s="这是一个合法的\\
    n 字符串";

    反斜杠除了可以被用作接续符,还能被用作转义字符的开始标识。常用的转义字符及其含义:
    \n 回车换行
    \t 横向跳到下一制表位置
    \v 竖向跳格
    \b 退格
    \r 回车
    \f 走纸换页
    \\ 反斜扛符"\"
    \' 单引号符
    \a 鸣铃
    \ddd 1~3 位八进制数所代表的字符
    \xhh 1~2 位十六进制数所代表的字符

    广义地讲,C 语言字符集中的任何一个字符均可用转义字符来表示。表中的\ddd 和\xhh正是为此而提出的。ddd 和hh 分别为八进制和十六进制的ASCII 代码。如\102 表示字母"B",\134 表示反斜线,\X0A 表示换行等。


    C语言注释符号

    一、几个似非而是的注释问题

    C 语言的注释可以出现在C 语言代码的任何地方。这句话对不对?这是我当学生时我老师问的一个问题。我当时回答是不对。好,那我们就看看下面的例子:
    A)
    int/*...*/i;

    B)
    char* s="abcdefgh //hijklmn";

    C)
    //Is it a \
    valid comment?

    D)
    in/*…*/t i;

    我们知道C 语言里可以有两种注释方式:/* */ 和//。那上面3 条注释对不对呢?建议你亲自在编译器中测试一下。上述前3条注释都是正确的,最后一条不正确。
    A),有人认为编译器剔除掉注释后代码会被解析成inti,所以不正确。编译器的确会将注释剔除,但不是简单的剔除,而是用空格代替原来的注释。再看一个例子:
       /*这是*/#/*一条*/define/*合法的*/ID/*预处理*/replacement/*指*/list/*令*/
    你可以用编译器试试。
    B),我们知道双引号引起来的都是字符串常量,那双斜杠也不例外。
    C),这是一条合法的注释,因为\是一个接续符。关于接续符,下面还有更多讨论。
    D), 前面说过注释会被空格替换,那这条注释不正确就很好理解了。

    现在你可以回答前面的问题了吧?但注意:/*…*/这种形式的注释不能嵌套,如:
       /*这是/*非法的*/*/
    因为/*总是与离它最近的*/匹配。

    二、y = x/*p

    y = x/*p,这是表示x 除以p 指向的内存里的值,把结果赋值为y?我们可以在编译器上测试一下,编译器提示出错。

    实际上,编译器把/*当作是一段注释的开始,把/*后面的内容都当作注释内容,直到出现*/为止。这个表达式其实只是表示把x 的值赋给y,/*后面的内容都当作注释。但是,由于没有找到*/,所以提示出错。

    我们可以把上面的表达式修改一下:
       y = x/ *p
    或者
       y = x/(*p)
    这样的话,表达式的意思就是x 除以p 指向的内存里的值,把结果赋值为y 了。

    也就是说只要斜杠(/)和星号(*)之间没有空格,都会被当作注释的开始。这一点一定要注意。

    三、怎样才能写出出色的注释

    注释写得出色非常不容易,但是写得糟糕却是人人可为之。糟糕的注释只会帮倒忙。

    1、安息吧,路德维希.凡.贝多芬
    在《Code Complete》这本书中,作者记录了这样一个故事:有位负责维护的程序员半夜被叫起来,去修复一个出了问题的程序。但是程序的原作者已经离职,没有办法联系上他。这个程序员从未接触过这个程序。在仔细检查所有的说明后,他只发现了一条注释,如下:
       MOV AX 723h ;R.I.P.L.V.B.
    这个维护程序员通宵研究这个程序,还是对注释百思不得其解。虽然最后他还是把程序的问题成功排除了,但这个神秘的注释让他耿耿于怀。说明一点:汇编程序的注释是以分号开头。

    几个月后,这名程序员在一个会议上遇到了注释的原作者。经过请教后,才明白这条注释的意思:安息吧,路德维希.凡.贝多芬(Rest in peace, Ludwig Van Neethoven)。贝多芬于1827 年逝世,而1827 的十六进制正是723。这真是让人哭笑不得!

    2、windows 大师们用注释讨论天气问题
    还有个例子:前些日子windows 的源代码曾经泄漏过一部分。人们在看这部分大师的经典作品时,却发现很多与代码毫无关系的注释!有的注释在讨论天气,有的在讨论明天吃什么,还有的在骂公司和老板。这些注释虽然与代码无关,但总比上面那个让贝多芬安息的注释要强些的。至少不会让你抓狂。不过这种事情只有大师们才可以做,你可千万别用注释
    讨论天气。
    3、出色注释的基本要求
    1. 注释应当准确、易懂,防止有二义性。错误的注释不但无益反而有害。
    2. 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要及时删除。
    3. 注释是对代码的“提示”,而不是文档。程序中的注释应当简单明了,注释太多了会让人眼花缭乱。
    4. 一目了然的语句不加注释。例如:i++; /* i 加1 */——多余的注释
    5. 对于全局数据(全局变量、常量定义等)必须要加注释。
    6. 注释采用英文,尽量避免在注释中使用缩写,特别是不常用缩写。因为不一定所有的编译器都能显示中文,别人打开你的代码,你的注释也许是一团乱码。还有,你的代码不一定是懂中文的人阅读。
    7. 注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但不可放在下方。同一结构中不同域的注释要对齐。
    8. 当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。
    9. 注释的缩进要与代码的缩进一致。
    10. 注释代码段时应注重“为何做(why)”,而不是“怎么做(how)”。说明怎么做的注释一般停留在编程语言的层次,而不是为了说明问题。尽力阐述“怎么做”的注释一般没有告诉我们操作的意图,而指明“怎么做”的注释通常是冗余的。
    11. 数值的单位一定要注释。注释应该说明某数值的单位到底是什么意思。比如:关于长度的必须说明单位是毫米,米,还是千米等;关于时间的必须说明单位是时,分,秒,还是毫秒等。
    12. 对变量的范围给出注释。
    13. 对一系列的数字编号给出注释,尤其在编写底层驱动程序的时候(比如管脚编号)。
    14. 对于函数的入口出口数据给出注释。

    关于函数的注释在函数那章有更详细的讨论。

    C语言符号有哪些

    符号有什么好说的呢?确实,符号可说的内容要少些,但总还是有些可以唠叨地方。有一次上课,我问学生:‘/’这个符号在C 语言里都用在哪些地方?没有一个人能答完整。

    这说明C 语言的基础掌握不牢靠,如果真正掌握了C 语言,你就能很轻易的回答上来。这个问题就请读者试着回答一下吧。本章不会像关键字一样一个一个深入讨论,只是将容易出错的地方讨论一下。
    表(2.1)标准C 语言的基本符号
    C 语言的基本符号就有20 多个,每个符号可能同时具有多重含义,而且这些符号之间相互组合又使得C 语言中的符号变得更加复杂起来。

    你也许听说过“国际C 语言乱码大赛(IOCCC)”,能获奖的人毫无疑问是世界顶级C程序员。这是他们利用C 语言的特点极限挖掘的结果。下面这个例子就是网上广为流传的一个经典作品:

    #i nclude <stdio.h>
    main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
    main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
    iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \}'+}##(!!/"):t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1):0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m.vpbks,fxntdCeghiry"),a+1);}

    还没发狂?看来你抵抗力够强的。这是IOCCC 1988 年获奖作品,作者是Ian Phillipps。

    毫无疑问,Ian Phillipps 是世界上最顶级的C 语言程序员之一。你可以数数这里面用了多少个符号。当然这里我并不会讨论这段代码,也并不是鼓励你也去写这样的代码(关于这段代码的分析,你可以上网查询)。恰恰相反,我要告诉你的是:大师把代码写成这样是经典,你把代码写成这样是垃圾!所以在垃圾和经典之间,你需要做一个抉择。




    展开全文
  • C语言符号优先级

    2015-05-11 12:51:38
    原博地址:C语言符号优先级 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右   ()...

    原博地址:C语言符号优先级

    优先级

    运算符

    名称或含义

    使用形式

    结合方向

    说明

    1

    []

    数组下标

    数组名[常量表达式]

    左到右

     

    ()

    圆括号

    (表达式)/函数名(形参表)

     

    .

    成员选择(对象)

    对象.成员名

     

    ->

    成员选择(指针)

    对象指针->成员名

     

    2

    -

    负号运算符

    -表达式

    右到左

    单目运算符

    (类型)

    强制类型转换

    (数据类型)表达式

     

    ++

    自增运算符

    ++变量名/变量名++

    单目运算符

    --

    自减运算符

    --变量名/变量名--

    单目运算符

    *

    取值运算符

    *指针变量

    单目运算符

    &

    取地址运算符

    &变量名

    单目运算符

    !

    逻辑非运算符

    !表达式

    单目运算符

    ~

    按位取反运算符

    ~表达式

    单目运算符

    sizeof

    长度运算符

    sizeof(表达式)

     

    3

    /

    表达式/表达式

    左到右

    双目运算符

    *

    表达式*表达式

    双目运算符

    %

    余数(取模)

    整型表达式/整型表达式

    双目运算符

    4

    +

    表达式+表达式

    左到右

    双目运算符

    -

    表达式-表达式

    双目运算符

    5

    << 

    左移

    变量<<表达式

    左到右

    双目运算符

    >> 

    右移

    变量>>表达式

    双目运算符

    6

    大于

    表达式>表达式

    左到右

    双目运算符

    >=

    大于等于

    表达式>=表达式

    双目运算符

    小于

    表达式<表达式

    双目运算符

    <=

    小于等于

    表达式<=表达式

    双目运算符

    7

    ==

    等于

    表达式==表达式

    左到右

    双目运算符

    !=

    不等于

    表达式!= 表达式

    双目运算符

    8

    &

    按位与

    表达式&表达式

    左到右

    双目运算符

    9

    ^

    按位异或

    表达式^表达式

    左到右

    双目运算符

    10

    |

    按位或

    表达式|表达式

    左到右

    双目运算符

    11

    &&

    逻辑与

    表达式&&表达式

    左到右

    双目运算符

    12

    ||

    逻辑或

    表达式||表达式

    左到右

    双目运算符

    13

    ?:

    条件运算符

    表达式1? 表达式2:表达式3

    右到左

    三目运算符

    14

    =

    赋值运算符

    变量=表达式

    右到左

     

    /=

    除后赋值

    变量/=表达式

     

    *=

    乘后赋值

    变量*=表达式

     

    %=

    取模后赋值

    变量%=表达式

     

    +=

    加后赋值

    变量+=表达式

     

    -=

    减后赋值

    变量-=表达式

     

    <<=

    左移后赋值

    变量<<=表达式

     

    >>=

    右移后赋值

    变量>>=表达式

     

    &=

    按位与后赋值

    变量&=表达式

     

    ^=

    按位异或后赋值

    变量^=表达式

     

    |=

    按位或后赋值

    变量|=表达式

     

    15

    ,

    逗号运算符

    表达式,表达式,…

    左到右

    从左向右顺序运算

    说明:

    同一优先级的运算符,运算次序由结合方向所决定。

     

    优先级口诀

     

    括号成员第一;         括号运算符[]() 成员运算符.  ->

    全体单目第二;         所有的单目运算符比如++ -- +(正) -(负) 指针运算*&

    乘除余三,加减四;      这个"余"是指取余运算即%

    移位五,关系六;       移位运算符:<< >> ,关系:> < >= <= 等

    等于(与)不等排第七;   即== !=

    位与异或和位或;       这几个都是位运算: 位与(&)异或(^)位或(|)

    "三分天下"八九十; 

    逻辑或跟与;           逻辑运算符:|| 和 &&

    十二和十一;           注意顺序:优先级(||)  底于 优先级(&&)

    条件高于赋值,          三目运算符优先级排到 13 位只比赋值运算符和","高

    逗号运算级最低!       逗号运算符优先级最低


    展开全文
  • C语言符号表和类型系统2

    千次阅读 2016-09-12 15:58:29
    阅读博客的朋友可以到我的网易云课堂中,通过视频的方式查看代码的调试和执行过程:...基于上一节的基础,我们看看,编译器如何为一个变量构建它在符号表中的记录和类型系统。
  • C语言符号表和类型系统1

    万次阅读 2016-09-06 17:37:26
    绝大多数编程语言都可以分成三部分:声明(declaration),表达式(expression),... 每部分都有专门的语法来定义,在上一节中,我们通过语法定义了C语言,本节,我们看看如何为C语言的变量建立类型系统,以便支持代码生成
  • C语言符号优先级速查

    2019-11-10 11:10:30
    C语言符号优先级速查 优先级 运算符 名称或含义 使用方式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参) . 成员选择...
  • C语言符号的优先级

    万次阅读 多人点赞 2018-04-20 12:30:03
    强制:()这个符号所代表的含义可以有 类型转换,参数,函数调用。 下标:[] 就是数组元素的下标。 成员: -&gt; 与. 这两个符号代表的是结构型和共用型成员。 14优先级有:逻辑,位,算术,指针,算...
  • C语言符号优先级.pdf

    2020-09-03 15:30:29
    附录 2 C 语言中的运算符及其优先级 附录 2 C 语言中的运算符及其优先级 优先级 运算符 名称或含义 使用形式 结合方向 说明 [] 数组下标 数组名 [ 常量表达式 ] 表达式/ 函数名 ) 圆括号 1 ( 形参 ) 左到右 ....
  • 上一节,我们研究了如何在语法上解析结构体,这一节,我们在语法分析的基础上,实现结构体符号表和类型系统的代码,我们要解析的结构体定义如下:struct tag { int *a, b; long c; sturct tag *d; }name;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,543
精华内容 617
关键字:

c语言符号表

c语言 订阅