2013-06-07 4 views
1

아래 코드에 문제가 있습니다 ... 누군가 내게 설명 할 수있는 이유는 무엇이며 그 이유는 무엇입니까?다음 코드의 배열이 인쇄되지 않게하는 원인은 무엇입니까?

#include<stdio.h> 

#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) 
int array[] = {23,34,12,17,204,99,16}; 

int main() 
{ 
    int d; 

    for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) 
     printf("%d\n",array[d+1]); 

    return 0; 
} 
+0

'TOTAL_ELEMENTS' 부호 (예 : 서명이 오래 오래),'거라고 <= (TOTAL_ELEMENTS-2)'비교한다 서명되지 않은. – BLUEPIXY

답변

1

를 sizeof 연산자를 변경 찾아주세요 결과는 implementation-de입니다. NED, 그 종류 (부호없는 정수 형태) 는이 size_t 드 Fi를 < stddef.h와> (및 다른 헤더)에 네드이다. " - C99 표준.

변환 : ...

는 "그렇지 않으면, 부호없는 정수 유형이 피연산자가있는 경우 크거나 다른 피연산자의 유형의 계급, 부호있는 정수 유형과 다음 피연산자와 동일한 순위 부호없는 정수 유형의 피연산자 유형으로 변환됩니다. " - C99 표준.

int d (-1) 형식은 (TOTAL_ELEMENTS-2) 형식으로 변환되며 sizeof 반환 유형 (부호없는 정수)입니다. 이것은 대개 부호없는 값 => -1 부호가있는 정수 = 0xFFFFFFFF (int가 32 비트 인 경우) 부호없는 정수로 비트를 재 해석하여 수행됩니다.

0xFFFFFFFF를 0x5 (TOTAL_ELEMENTS-2)와 비교하려고합니다.이 값은 false입니다.

당신은 경고 ... 서명/서명이 일치해야

...

C99 standard

3

일반적인 산술 변환. <= 식에서

int-1 값이 sizeof 부호의 형식으로 변환하고, 큰 값이되고, 식 <= 다음 거짓이다.

사용 :의 ...

"값 :

for(d=-1;d <= (int) (TOTAL_ELEMENTS-2);d++) 
1

(가) 아래

사용법 #include

#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) 
int array[] = {23,34,12,17,204,99,16}; 

int main() 
{ 
    int d,k; 
k=TOTAL_ELEMENTS-2; 
    for(d=-1;d <=k ;d++) 
     printf("%d\n",array[d+1]); 

    return 0; 
}