这段代码打印的是什么?为什么?

时间:2016-11-03 23:13:56

标签: c

任何人都可以解释一下,为什么这个代码打印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;
}

3 个答案:

答案 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宏。