programing

-1에서 시작하는 루프는 아무것도 인쇄하지 않습니다.

prostudy 2022. 6. 28. 22:42
반응형

-1에서 시작하는 루프는 아무것도 인쇄하지 않습니다.

이 프로그램은 의 요소를 출력하는 것으로 되어 있습니다.array단, 실행 시 출력은 표시되지 않습니다.

#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;
}

이 프로그램에서는 왜 출력이 표시되지 않는 거죠?

sizeof부호 없는 정수를 반환하기 때문에TOTAL_ELEMENTS또한 서명되지 않았습니다.

d서명되어 있습니다.처음에d-1하지만 비교해보니d암묵적으로 typecast to unsigned로 되어 있기 때문에 더 이상 존재하지 않습니다.-1와 비교하면TOTAL_ELEMENTS,사실 그래.UINT_MAX(즉,4294967295사용하시는 머신에 따라 다를 수 있습니다).

또한.

이것을 수정하려면 , typecast 를 사용해 주세요.TOTAL_ELEMENTS로.int:

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

인쇄:

23
34
12
17
204
99
16

예상대로.부호 없는 비교 항목에 대한 자세한 내용은 부호 없는 정수와 부호 없는 정수에 대한 비교 작업을 참조할 수도 있습니다.

컴파일러 경고를 켜면 (그의 코멘트에서 hyde가 관찰한 바와 같이) 무슨 일이 일어나고 있는지 알아내는 데 도움이 될 것입니다.

$ gcc -Wall -Wextra test.c
test.c:7:17: warning: comparison of integers of different signs: 'int' and 'unsigned long' [-Wsign-compare]
      for(d = 0; d < TOTAL_ELEMENTS; d++) 
              ~ ^ ~~~~~~~~~~~~~~
1 warning generated.

아니면 왜 시작하지 않는가?d0로 달려가다TOTAL_ELEMENTS - 1대신?타입캐스트를 드롭할 수도 있습니다.이것은, 다음의 코너 케이스에만 필요한 것입니다.d = -1.

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

다음은 관련 C99 표준 발췌문이다.

  1. 6.3.1.8p2는 서명된 유형에서 서명되지 않은 유형으로의 변환을 정의합니다.

    부호 없는 정수 유형을 가진 오퍼랜드의 순위가 다른 오퍼랜드 유형의 순위보다 크거나 같은 경우 부호 있는 정수 유형을 가진 오퍼랜드는 부호 없는 정수 유형을 가진 오퍼랜드의 유형으로 변환됩니다.

  2. 6.3.1.3p2는 변환 방법을 정의합니다.추가에 의해UINT_MAX + 1서명된 대리인 앞으로.

    새 유형이 부호 없는 경우 값이 새 유형 범위 내에 있을 때까지 새 유형으로 나타낼 수 있는 최대 값보다 하나 더 많은 값을 반복하여 더하거나 빼서 값이 변환됩니다.

    그렇게-1=>-1 + (UINT_MAX + 1)=UINT_MAX를 참조해 주세요.

my gcc는 다음 경고를 출력합니다.

warning: comparison of integers of different signs: 'int' and 'unsigned long' [-Wsign-compare]
      for(d = 0; d < TOTAL_ELEMENTS; d++) 

즉,(TOTAL_ELEMENTS-2)unsigned int하는 동안에dsigned int이렇게 하면 항상 표정이 됩니다.false 「」에 d부터, syslog(unsigned int)(-1) > (TOTAL_ELEMENTS-2).

서로 다른 적분 유형 간의 이진 연산은 이른바 통상적인 산술 변환에 의해 정의된 "공통" 유형 내에서 수행됩니다.따라서 int d는 값 -1로 초기화된 sing 타입입니다.부호 없는 int로 변환하면 TOTAL_ELENS에서 반환된 값보다 훨씬 큰 부호 없는 int가 반환됩니다.

언급URL : https://stackoverflow.com/questions/45657517/loop-starting-at-1-doesnt-print-anything

반응형