2016-11-03 257 views
-4

任何人都可以請解釋我爲什麼這個代碼打印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

什麼是4 + 2%4和1 + 3 + 1%4? – immibis

回答

2

#define做文本替換,所以

SOMETHINGDEFINED(1 + 3 + 1)-- 

成爲

A[1 + 3 + 1%4]-- 

現在你可以看到模僅適用於過去的操作數,而不是整個表達式。您必須將宏定義爲

#define SOMETHINGDEFINED(i) A[(i)%4] 

將其正確應用於整個表達式。

+0

其實,我有這樣的任務。它問這個代碼打印什麼,我試圖解決它,然後編譯它,而VS的結果與我的不同。試過調試它,並沒有得到它,所以... 嗯,謝謝傑克! :) – redbaron

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]舊值。

+0

幸運的是'1 + 3 + 1%4'是5而不是4,否則就是_undefined behavior_。 –

+0

@RolandIllig我不好,你說得對。 – grigor

1

在C中,宏是一個簡單的文本替換。自己進行替換(不插入額外的括號),或者瞭解如何在不實際編譯C編譯器預處理代碼的情況下進行編譯。這會給你足夠的信息來理解這個話題。

順便說一句,示例代碼是一個很好的演示,爲什麼你儘可能不要使用C宏。