-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.
아니면 왜 시작하지 않는가?d
에0
로 달려가다TOTAL_ELEMENTS - 1
대신?타입캐스트를 드롭할 수도 있습니다.이것은, 다음의 코너 케이스에만 필요한 것입니다.d = -1
.
for(d = 0; d < TOTAL_ELEMENTS; d++)
printf("%d\n", array[d]);
다음은 관련 C99 표준 발췌문이다.
6.3.1.8p2는 서명된 유형에서 서명되지 않은 유형으로의 변환을 정의합니다.
부호 없는 정수 유형을 가진 오퍼랜드의 순위가 다른 오퍼랜드 유형의 순위보다 크거나 같은 경우 부호 있는 정수 유형을 가진 오퍼랜드는 부호 없는 정수 유형을 가진 오퍼랜드의 유형으로 변환됩니다.
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
하는 동안에d
이signed 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
'programing' 카테고리의 다른 글
Vue Devtool 확장 힌트 사용 안 함 (0) | 2022.06.28 |
---|---|
학습되지 않은 구문 오류 및 Vuex 식별자 (0) | 2022.06.28 |
C# 퍼포먼스 - IntPtr 및 Marshal 대신 안전하지 않은 포인터 사용 (0) | 2022.06.28 |
Vuetify: carousel을 사용하여 컴포넌트를 표시합니다. (0) | 2022.06.28 |
먼저 서버에서 개체를 로드하는 방법 - vuejs - vuex (0) | 2022.06.28 |