任何人都可以解释一下,为什么这个代码打印1 3 0 0 0 -1,而不是1 2 3 0 0 0?这个定义工作如何?
#include<stdio.h>
#define SOMETHINGDEFINED(i) A[i%4]
int main(void) {
int i, A[6] = { 1 };
SOMETHINGDEFINED(1) = 2;
SOMETHINGDEFINED(5) = 3;
SOMETHINGDEFINED(4 + 2) = SOMETHINGDEFINED(1 + 3 + 1)--;
for (i = 0; i < 6; i++) {
printf("%d ", A[i]);
}
return 0;
}
答案 0 :(得分:3)
#define
会进行文字替换,所以
SOMETHINGDEFINED(1 + 3 + 1)--
变为
A[1 + 3 + 1%4]--
现在您可以看到模数仅应用于最后一个操作数,而不是整个表达式。您必须将宏定义为
#define SOMETHINGDEFINED(i) A[(i)%4]
将其正确应用于整个表达式。
答案 1 :(得分:1)
SOMETHINGDEFINED(4 + 2) = SOMETHINGDEFINED(1 + 3 + 1)--;
转换为A[4 + 2 % 4] = A[1 + 3 + 1 % 4]--;
,即A[6]=A[5]--;
A[5]--
获取A[5]
的旧值,即0并返回,然后减少A[5]
,然后,作业将A[5]
的旧值分配给A[6]
。
答案 2 :(得分:1)
在C中,宏是一个简单的文本替换。自己做替换(不插入额外的括号),或者找出如何制作C编译器预处理代码而不实际编译它。这将为您提供足够的信息来理解这个主题。
顺便说一句,示例代码是一个很好的演示,为什么你不应该尽可能使用C宏。