一道有关#define的题

题目是:查看以下代码,问结果是什么?

结果是打印出“array:16345678910”吗?

#include "stdafx.h"
#include <iostream>

using namespace std;

#define SUB(x,y) x-y
#define ACCESS_BEFORE(element,offset,value) *SUB(&element, offset) =value

int _tmain(int argc, _TCHAR* argv[])
{
    int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int i;
    ACCESS_BEFORE(array[5], 4, 6);
    printf("array: ");
    for (i = 0; i<10; ++i){
        printf("%d", array[i]);
    }
    printf("\n");
    return 0;
}

#define其实是简单的替换,这里先把ACCESS_BEFORE(array[5], 4, 6)替换成:

*SUB(&array[5],4)=6,再利用SUB的定义,最终被替换成:

*&array[5]-4=6。*&array[5]就是array[5],代入值即为6-4=6,编译器报“左值”相关错误,这里左值是常量2,不可赋值。

有趣的地方是,由于思维定势,人们会将*SUB(&array[5],4)=6替换为*(&array[5]-4)=6。由于#define只是简单的替换,所以这个圆括号是实际不存在的。

把原代码中的#define ACCESS_BEFORE(element,offset,value) *SUB(&element, offset) =value修改为:

#define ACCESS_BEFORE(element,offset,value) *(SUB(&element, offset)) =value,就正确了。

posted @ 2013-12-20 11:07  XIAOSHUA  阅读(260)  评论(0编辑  收藏  举报