字体
第(5/6)页
关灯
   存书签 书架管理 返回目录
以避免出错。在上例中的宏定义中

    (y)*(y)表达式的 y 都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形

    式:

    【例 9.6】

    #define SQ(y) y*y

    main(){

    int a,sq;

    printf("input a number:    ");

    scanf("%d",&a);

    sq=SQ(a+1);

    printf("sq=%d\n",sq);

    }

    运行结果为:

    input a number:3

    sq=7

    同样输入 3,但结果却是不一样的。问题在哪里呢? 这是由于代换只作符号代换而不作

    其它处理而造成的。宏代换后将得到以下语句:

    sq=a+1*a+1;

    由于 a 为 3 故 sq 的值为 7。这显然与题意相违,因此参数两边的括号是不能少的。即使

    在参数两边加括号还是不够的,请看下面程序:

    【例 9.7】

    #define SQ(y) (y)*(y)

    main(){

    int a,sq;

    printf("input a number:    ");

    scanf("%d",&a);

    sq=160/SQ(a+1);

    printf("sq=%d\n",sq);

    }

    本程序与前例相比,只把宏调用语句改为:

    sq=160/SQ(a+1);

    运行本程序如输入值仍为 3 时,希望结果为 10。但实际运行的结果如下:

    input a number:3

    sq=160

    为什么会得这样的结果呢?分析宏调用语句,在宏代换之后变为:

    sq=160/(a+1)*(a+1);

    a 为 3 时,由于“/”和“*”运算符优先级和结合xìng相同,则先作 160/(3+1)得 40,再作 40*(3+1)

    最后得 160。为了得到正确答案应在宏定义中的整个字符串外加括号,程序修改如下:

    【例 9.8】

    #define SQ(y) ((y)*(y))

    main(){

    int a,sq;

    printf("input a number:    ");

    scanf("%d",&a);

    sq=160/SQ(a+1);

    printf("sq=%d\n",sq);

    }

    以上讨论说明,对于宏定义不仅应在参数两侧加括号,也应在整个字符串外加括号。

    5. 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一

    表达式用函数处理与用宏处理两者的结果有可能是不同的。

    【例 9.9】

    main(){

    int i=1;

    while(i<=5)

    printf("%d\n",SQ(i++));

    }

    SQ(int y)

    {

    return((y)*(y));

    }
上一页 目录 下一页