优先级和类型转换分析

1.易错的优先级

【编程实验】

#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)
}
 
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
     
    free(pD);
     
    return 0;
}

 2. C语言隐式类型转换

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

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

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

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

int main()
{
     char c = 'c';
     short s = 0;

     s = c;   //不会报错
     printf("%d\n", sizeof(s+c));  //输出为4
}

编译的Bug吗?

【隐式类型转换带来的困惑】

#include <stdio.h>
 
int main()
{
    int i = -2;
    unsigned int j = 1;
     
    if( (i + j) >= 0 )
    {
        printf("i+j>=0\n");  //int被转换为 unsigned int类型, 因此被执行
    }
    else
    {
        printf("i+j<0\n");
    }
     
    printf("i+j=%d\n", i + j);  //i+j为全F,printf中%d又要求以int数(有符号)来打印,因此输出i+j=-1;
     
    return 0;
}

 

posted on 2018-04-16 14:59  arabain  阅读(134)  评论(0)    收藏  举报

导航