码迷,mamicode.com
首页 > 编程语言 > 详细

程序猿之---C语言细节9

时间:2014-11-04 17:30:28      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:c语言   宏定义细节   max宏   大小端判断   

主要内容:宏定义、max(a,b)宏定义细节、大小端判断、(int&)a什么意思

#if 1 
#include <stdio.h>

// 注意空格 
#define F (x) ((x) - 1)   // F代表后面
#define F(x) ((x) - 1)    // F(x)代表后面

#define T1 struct type*
T1 a,b;  // 使用上面在定义多个变量时达不到目的,被解析为struct type* a,b;  a为指向结构体的指针,而b被定义为一个结构体 
 // 经典的笔试题宏定义求最大值
//#define max(a,b) a>b?a:b          //这个很容易错,下面的比较不容易错,但是也会有错的时候 
#define max(a,b) ((a)>(b)?(a):(b))     // 写成这样得不到满分,仍然可能会出现问题,解释如下 
                                       // 同时这个宏定义也没有考虑传入不同类型的参数情况,
									   									   
 /*  
  *   如果一个操作数在两处被用到,就会被求值两次;
  *   表达式max(a,b)中如果带有副作用,在比较大小时会计算一次,在后面计算值时也会计算一次 
  *   错误例子如下 : 
  */
int main(int argc, char** argv)
{
    int x[3] = {2,3,1};
    int biggest = x[0];
    int i = 1;
    
    while(i < 3)
    {
    	biggest = max(biggest, x[i++]);  // 被拆解为biggest > x[i++]?biggest:x[i++],(biggest=2)<(x[1]=3)
										 //  关键点在于i在比较大小时有副作用,i++在后时i已经加1,biggest=x[2] 
    }                                    // 解决方法是确定参数中没有副作用,或则直接编写max函数 
    printf("biggest is %d\n",biggest);
    
//    一种考虑传入不同变量类型的max宏定义
//比较正确的答案应为:
#define MAX(a,b) ({            const typeof(a) _a = a;            const typeof(b) _b = b;            (void)(&_a == &_b); \  
           _a > _b ? _a : _b;}) 
	return 0;
}

// 下面是测试大小端的方法 ,已经使用#if #elif  需要自己打开相应开关 
// 补充一个 (int&)a是什么意思 ?(int&)a就是*(int*)(&a) 
#elif 1 
 
#include<stdio.h>

int main()
{
    int x = 1;
    char *p = (char *)&x;

    if(*p)
    {
        printf("little\n");
    }
    else
    {
        printf("large\n");
    }
    return 0;
}


#else 

#include <stdio.h>

int main()
{
    short int x;
    char x1,x2;
    x = 0x1122;
    x1 = ((char *)&x)[0];    //低地址
    x2 = ((char *)&x)[1];    //高地址
    printf("x1=%x\n",x1);
    printf("x2=%x\n",x2);
    return 0;
}

#endif 

输出:

宏定义和大小端

bubuko.com,布布扣

bubuko.com,布布扣

程序猿之---C语言细节9

标签:c语言   宏定义细节   max宏   大小端判断   

原文地址:http://blog.csdn.net/human_evolution/article/details/40785739

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!