2016-11-03 4 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, иначе это было бы _овершенное поведение_. –

+0

@ RolandIllig, мой плохой, ты прав. – grigor

1

В C макросы - это простая замена текста. Сделайте замену самостоятельно (без вставки дополнительных скобок) или узнайте, как сделать код препроцессора компилятора C без фактической компиляции. Это даст вам достаточно информации, чтобы понять эту тему.

Кстати, пример кода - отличная демонстрация, почему вы не должны использовать макросы C, насколько это возможно.

Смежные вопросы