C语言运算符的优先级和关键字

时间:2021-10-25 03:52:17

     C语言运算符优先级:

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

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

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

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

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

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

"三分天下"八九十;  

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

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

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

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

       

优先级

运算符

名称

运算对象个数

结合性

1

()

圆括号

 

[]

下标运算符

 

->

指向成员运算符

 

.

结构体、共用体成员运算符

 

2

!

逻辑非

逻辑运算符

单目运算符

~

按位取反

位运算符

++

自增1

算术运算符

--

自减1

-

负号

类型

强制类型转换

*

指针运算符

&

取地址运算符

sizeof

求存储长度运算符

3

*

乘运算符

算术运算符

双目运算符

/

除运算符

%

余运算符

4

+

加运算符

算术运算符

双目运算符

-

减运算符

5

<<

左移运算符

位运算符

双目运算符

>>

右移运算符

6

>

大于运算符

关系运算符

双目运算符

<

小于运算符

>=

大于等于运算符

<=

小于等于运算符

7

==

等于运算符

双目运算符

!=

不等于运算符

8

&

按位与运算符

位运算符

双目运算符

9

^

按位异或运算符

双目运算符

10

|

按位或运算符

双目运算符

11

&&

与运算符

逻辑运算符

双目运算符

12

||

或运算符

双目运算符

13

? :

条件运算符

三目运算符

14

=

赋值运算符

双目运算符

+=

-+

*=

/=

%=

>>=

<<=

&=

^=

|=

15

,

逗号运算符

 


        例子:((*strDest++=*strSrc++)!='/0');

           1. 上面表达式是一个组合表达式。首注意到"()"操作符,它具有最高的优先级,所以从整体来看,整个表达式应该是个"!="操作。"!="左边又是一个组合表达式,而右边是一个常量"/0',很明显下面的工作就是评估(*strDest++=*strSrc++)。

            2.这一步对表达式(*strDest++=*strSrc++)进行评估。"*","++"的优先级都比"="高,所以表达式又可以写成:(*strDest++) = (*strSrc++),所以整个表达式是个"="操作,"="左边又是一个组合表达式,右边也是一个组合表达式,这里就需要从关联性来判断左边还是右边也被评估。由于"="的关联性是从右到左,所以右边(*strSrc++)先被评估,左边(*strDest++)后被评估。

            2.1.这一步对表达式(*strSrc++)进行评估。由于"++"的优先级大于"*",所以表达式又可以写成:*(strSrc++)。先对表达式strSrc++进行评估,然后用表达式的值再去评估*(strSrc++)的值。对于表达式strSrc++,这里要需要注意区分变量的值和表达式的值。对于"后增1"表达式strSr++,表达式的值是变量strSrc的值,然后变量strSrc的值会"加1",也就是说表达式的值是strSrc变化前的值,而strSrc的值会发生变化。值得注意的是,我们知道strSrc的值会发生变化,但是我们却不知道strSrc的值发生变化的具体时间,这个变化具体的执行时间由编译器决定了,这就决定了任何依赖strSrc的表达式的值是不确定的,具体的值依赖编译器的实现。完成了对strSrc++的评估后,取值操作符就对表达式的值所对应的内存空间进行取值操作。
            2.2 这一步对表达式(*strDest++)进行评估。具体的评估的分析完全和2.1中的分析一致。
            2.3 这一步对表达式(*strDest++) = (*strSrc++)进行评估,这是个赋值表达式,将右表达式的值赋给左边表达式的值。值得注意的是,对于赋值表达式,表达式本身的值等于左边子表达式的值。

            3.由于"!="表达式左边的子表达式的值已经被评估出来了,下面就执行"!="操作。"!="表达式的是一个布尔值。

     C语言32个关键字:

            根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。
1 数据类型关键字
         A基本数据类型(5个)
      void :声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
      char :字符型类型数据,属于整型数据的一种
      int :整型数据,通常为编译器指定的机器字长
      float :单精度浮点型数据,属于浮点数据的一种
      double :双精度浮点型数据,属于浮点数据的一种
       B 类型修饰关键字(4个)
    short :修饰int,短整型数据,可省略被修饰的int。
    long :修饰int,长整形数据,可省略被修饰的int。
    signed :修饰整型数据,有符号数据类型
    unsigned :修饰整型数据,无符号数据类型
       C 复杂类型关键字(5个)
    struct :结构体声明
    union :共用体声明
    enum :枚举声明
    typedef :声明类型别名
    sizeof :得到特定类型或特定类型变量的大小
       D 存储级别关键字(6个)
    auto :指定为自动变量,由编译器自动分配及释放。通常在栈上分配
    static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部 
    register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
    extern :指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的对象的一个“引用”
    const :与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
    volatile :与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
2 流程控制关键字
       A 跳转结构(4个)
    return :用在函数体中,返回特定值(或者是void值,即不返回值)
    continue :结束当前循环,开始下一轮循环
    break :跳出当前循环或switch结构
    goto :无条件跳转语句
       B 分支结构(5个)
    if :条件语句
   else :条件语句否定分支(与if连用) 
   switch :开关语句(多重分支语句)
   case :开关语句中的分支标记
   default :开关语句中的“其他”分治,可选。
     C 循环结构(3个)
   for :for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件
   do :do循环结构,do 1 while(2); 的执行顺序是 1->2->1...循环,2为循环条件
   while :while循环结构,while(1) 2; 的执行顺序是1->2->1...循环,1为循环条件