易截截图软件、单文件、免安装、纯绿色、仅160KB

我的C实践(1):宏的应用

    1、为了调用宏时能得到正确结果,在宏体中建议对宏的每个参数用括号括起来,并且当宏体是一个表达式时整个宏体也用括号括起来。
/* c1.c:将两个数相乘 */
#define product(x,y) ((x)*(y))
#include <stdio.h>
int main(){
int a=1,b=2,c=3,d=4,x=0;

x=product(a+3,b)+product(c,d); /* 若宏体中没有使用括号,则得不到
你想要的结果 */
printf("%d\n",x);
return 0;
}

    2、用宏来插入任意语句。
/* c2.c:插入任意语句 */
#define insert(stmt) stmt /* 插入任意语句 */
#include <stdio.h>
int main(){
int a,b;
insert({ a=1;b=1; }) /* 这是一个复合语句 */
insert({ a=1,b=1; }) /* 如果逗号表达式不用圆括号括起,则预处理器会认为
有两个实参,报错 */
printf("a=%d, b=%d\n",a,b);
return 0;
}


    注意,第2个调用中逗号表达式语句要用括号括起来,否则预处理器会认为给宏传了两个实参,由于没有两个实参的incr,因此会报错。
    3、为了使函数式宏能像真正的函数一样工作,建议用do{  }while(0)语句包住宏体的代码。
/* c3.c: 交换两个整型变量的值 */
/* #define swap(x,y) { int temp=x; x=y; y=temp; } */
#define swap(x,y) \
do { int temp=x; x=y; y=temp; } while(0)
#include <stdio.h>
int main(){
int x=4,y=3;
if(x>y) swap(x,y); /* 用第一个swap时会出错,导致{ }后面有一个分号,
用第二个swap则没问题 */
else x=y;
printf("x=%d, y=%d\n",x,y);
return 0;
}

    如果用注释中定义那个swap,则if {...};后面会一个分号,单独的分号是一个空语句,这导致if与else之间有两个单独的语句不合法。而用do{ }while(0)套住语句时则不会有这样的问题。
    4、用宏来包装语句。
/* c4.c:打印1到20的立方表,用宏来包装循环语句 */
#define incr(v,low,high) \
for((v)=(low); (v)<=(high); (v)++)
#include <stdio.h>
int main(){
int j;
incr(j,1,20)
printf("%2d %6d\n",j,j*j*j);
return 0;


相关文档:

c陷阱与缺陷学习笔记

http://c.chinaitlab.com/c/basic/200907/789321.html
  词法陷阱:
    1        = 不同于==不要在程序中将两者写错,小心。将表达式与常量比较时,可将常量放在左边。
    2        &和| 不同于& ......

[推荐] C/C++招聘的一些感受和经验

http://topic.csdn.net/u/20080924/15/3b00a84e-970f-4dea-92f2-868c5d1ad825.html?52694
前段时间刚参加了n多公司的C/C++软件工程师的面试,有国企,外企,私企(moto,飞思卡尔,港湾,中国卫星XXX(这个牛))等等等等。感受感想颇多,近日终于空闲,在此表述一下。
    本人基本条件:3年开发经验,2year+ ......

C/C++ 程序员应聘常见面试试题深入剖析


      1.引言
 
  本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。
 
  许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strc ......

C/C++招聘的一些感受和经验

C/C++招聘的一些感受和经验
前段时间刚参加了n多公司的C/C++软件工程师的面试,有国企,外企,私企(moto,飞思卡尔,港湾,中国卫星XXX(这个牛))等等等等。感受感想颇多,近日终于空闲,在此表述一下。
本人基本条件:3年开发经验,2year+ Windows development experence,1year+ Linux experence. 熟悉C,C++,MFC/ ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号