zoukankan      html  css  js  c++  java
  • C语言-第14课

    第14课 - 优先级和类型转换分析

     

    问题引入:

    #include <stdio.h>

    #include <malloc.h>

    typedef struct _demo

    {

        int* pInt;

        float f;

    } Demo;

    int func(int v, int m)

    {

        return ((v & m )!= 0);

    }

    int main()

    {   

        Demo* pD = (Demo*)malloc(sizeof(Demo));

        int *p[5]; //int* p[5];

        int *f();  //int* f()

        int i = 0;  

        i = 1, 2;  // (i = 1), 2;   

      //  *pD.f = 0;

    pD->f = 0;  

        free(pD);  

        return 0;

    }

     

    1. 优先级别表格

    优先级

    运算符

    名称或含义

    使用形式

    结合方向

    说明

    1

    []

    数组下标

    数组名[常量表达式]

    左到右

     

    ()

    圆括号

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

     

    .

    成员选择(对象)

    对象.成员名

     

    ->

    成员选择(指针)

    对象指针->成员名

     

    ++

    后置自增运算符

    ++变量名

    单目运算符

    --

    后置自减运算符

    --变量名

    单目运算符

    2

    -

    负号运算符

    -表达式

    右到左

    单目运算符

    (类型)

    强制类型转换

    (数据类型)表达式

     

    ++

    前置自增运算符

    变量名++

    单目运算符

    --

    前置自减运算符

    变量名--

    单目运算符

    *

    取值运算符

    *指针变量

    单目运算符

    &

    取地址运算符

    &变量名

    单目运算符

    !

    逻辑非运算符

    !表达式

    单目运算符

    ~

    按位取反运算符

    ~表达式

    单目运算符

    sizeof

    长度运算符

    sizeof(表达式)

     

    3

    /

    表达式/表达式

    左到右

    双目运算符

    *

    表达式*表达式

    双目运算符

    %

    余数(取模)

    整型表达式/整型表达式

    双目运算符

    4

    +

    表达式+表达式

    左到右

    双目运算符

    -

    表达式-表达式

    双目运算符

    5

    <<

    左移

    变量<<表达式

    左到右

    双目运算符

    >>

    右移

    变量>>表达式

    双目运算符

    6

    >

    大于

    表达式>表达式

    左到右

    双目运算符

    >=

    大于等于

    表达式>=表达式

    双目运算符

    <

    小于

    表达式<表达式

    双目运算符

    <=

    小于等于

    表达式<=表达式

    双目运算符

    7

    ==

    等于

    表达式==表达式

    左到右

    双目运算符

    !=

    不等于

    表达式!= 表达式

    双目运算符

    8

    &

    按位与

    表达式&表达式

    左到右

    双目运算符

    9

    ^

    按位异或

    表达式^表达式

    左到右

    双目运算符

    10

    |

    按位或

    表达式|表达式

    左到右

    双目运算符

    11

    &&

    逻辑与

    表达式&&表达式

    左到右

    双目运算符

    12

    ||

    逻辑或

    表达式||表达式

    左到右

    双目运算符

    13

    ?:

    条件运算符

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

    右到左

    三目运算符

    14

    =

    赋值运算符

    变量=表达式

    右到左

     

    /=

    除后赋值

    变量/=表达式

     

    *=

    乘后赋值

    变量*=表达式

     

    %=

    取模后赋值

    变量%=表达式

     

    +=

    加后赋值

    变量+=表达式

     

    -=

    减后赋值

    变量-=表达式

     

    <<=

    左移后赋值

    变量<<=表达式

     

    >>=

    右移后赋值

    变量>>=表达式

     

    &=

    按位与后赋值

    变量&=表达式

     

    ^=

    按位异或后赋值

    变量^=表达式

     

    |=

    按位或后赋值

    变量|=表达式

     

    15

    ,

    逗号运算符

    表达式,表达式,

    左到右

    从左向右顺序运算

     

     

    1. 易错的优先级

    优先级问题

    表达式

    经常误认为的结果

    实际结果

    .的优先级高于*

    ->操作符用于消除这个问题

    *p.f

    P所指向的字段f

    (*P).p

    pf偏移,作为指针,然后进行解除引用操作。*(p.f)

    []高于*

    int *ap[]

    ap是个指向int数组的指针

    int (*fp)()

    ap是个元素为int指针的数组

    int *(ap[])

    函数()高于*

    int *fp()

    fp是个函数指针,所指的函数返回int

    int (*fp)()

    fp是个函数,返回值是int *

    int *(fp())

    ==!=高于操作位

    (val & mask != 0)

    (val & mask) != 0

    val & (mask != 0)

    ==!=高于赋值符

    c = getchar() !=EOF

    (c = getchar()) !=EOF

    c = (getchar() !=EOF)

    算数运算符高于位移运算符

    msb << 4 + 1sb

    (msb << 4) + 1sb

    msb << (4 + 1sb)

    逗号运算符在所有运算符中有心级别最低

    i = 1,2

    i = ( 1,2)

    (i = 1), 2

     

    1. C语言中隐式的类型转换

    (1) 算术运算式中,低类型转换为高类型。

    (2) 赋值表达式中,表达式的值转换为左边变量的类型。

    (3) 函数调用时,实参转换为形参的类型。

    (4) 函数返回值,return表达式转换为返回值类型。

     

    char + short = int

     

     

    1. 实例分析

    隐式类型转换带来困惑

    #include <stdio.h>

    int main()

    {

        int i = -2;

        unsigned int j = 1;   

        if( (i + j) >= 0 )

        {

            printf("i+j>=0 ");

        }

        else

        {

            printf("i+j<0 ");

        }   

        printf("i+j=%d ", i + j);

        return 0;

    }

    运行结果:i+j>=0

      i+j=-1

    -21相加的时候,-2被转化为unsigned int-2的补码是30110,共32位。也就是0xFFFFFFFE,把它看成是无符号整数就会很大,所以会打印i+j>=0int-1的补码是0xFFFFFFFF,但是%d表示以int型打印,所以会打印出来-1%s代表unsigned int

    改成printf("i+j=%0x ", i + j);运行结果是:i+j=0xFFFFFFFF

  • 相关阅读:
    微信JS SDK Demo
    微信jssdk常见错误及解决方法
    多机定时任务处理
    python zip压缩文件 并移动到指定目录
    Nginx + Uswgi + Django的部署
    pycharm 安装第三方库报错:AttributeError: 'module' object has no attribute 'main'
    zabbix监控
    转:老张喝茶 教你同步异步 阻塞与非阻塞
    odoo开发笔记 -- 多对多字段追加数据
    xml文件对比工具推荐:Altova XMLSpy 2013
  • 原文地址:https://www.cnblogs.com/free-1122/p/9706893.html
Copyright © 2011-2022 走看看