一道有关#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,就正确了。