14-priority_typeconversion

来源:互联网 发布:opt算法c语言代码 编辑:程序博客网 时间:2024/05/17 22:21

#include <stdio.h>
#include <malloc.h>
typedef struct _demo {
    int* pInt;
    float f;
} Demo;
int func(int v, int m) {
    /* return (v & m != 0); //v & (m != 0) */
    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 */
    i = (1, 2);
    /* *pD.f = 0; // *(pD.f) */
    (*pD).f = 0;
    free(pD);
    return 0;
}


易错的优先级
*p.num;
.的优先级高于*,->操作符作用于消除这个问题
 实际上是对p取f偏移,作为指针,然后进行取成员操作 <=> *(p.num)

int *ap[];
[]的优先级高于*
实际上ap是个元素为int*指针的数组 <=> int *(ap[])

int *fp();
函数()高于*
fp是个函数,返回int* <=> int*(fp())

(val & mask != 0)
==和!=高于位操作
<=> val & (mask != 0)

c = getchar() != EOF;
==和!=高于赋值操作
<=> (getchar() != EOF)

msb << 4 + lsb
算术运算符高于位移运算符
<=> msb << (4 + lsb)

i = 1, 2;
逗号运算符在所有运算符中优先级最低
<=> (i = 1), 2;
 

C语言隐式类型转换
算术运算表达式中,低类型转换为高类型;
赋值表达式中,表达式的值转换为左边变量的类型;
函数调用时,实参转换为形参的类型;
函数返回值,return表达式转换为返回值类型;

char ->
short -> int -> unsigned int -> long -> unsigned long -> double <- float


#include <stdio.h>
int main() {
    int i = -2;
    unsigned int j = 1;
    if ( (i + j) >= 0 ) {
        printf("i+j >= 0\n");
    } else {
        printf("i+j < 0\n");
    }
    printf("i+j=%0X\n", i + j); // FFFFFFFF
    printf("i+j=%d\n", i + j); // -1
    printf("i+j=%u\n", i + j); // 4294967295
    // 有符号和无符号类型在内存中的表示都是一样的;
    // 关键看我们的计算机如何解析;
    return 0;
}

-2
+2: 00000000 00000000 00000000 00000010
-2: 11111111 11111111 11111111 11111101 + 1
-2: 11111111 11111111 11111111 11111110
-2: 0xFFFFFFFE
+1: 00000000 00000000 00000000 00000001

-2+1:
    11111111 11111111 11111111 11111111
    0xFFFFFFFF
-1
+1  00000000 00000000 00000000 00000001
-1: 11111111 11111111 11111111 11111110 + 1
-1: 11111111 11111111 11111111 11111111
-1: 0xFFFFFFFF
printf("%d", i + j);
%d: 以int类型打印i+j; 结果是0xFFFFFFFF,被解析为-1
%u: 把-2转为uint,0xFFFFFFFE很大的正数;

0 0
原创粉丝点击