예상되는 것은
입니다. 1. 입력을 입력하십시오.
2. 입력을 읽고 입력 값을 반환하십시오.
3. sizeof 값을 확인하십시오.
4. sizeof 값을 인쇄하십시오.sizeof가 예상대로 작동하지 않는 이유는 무엇입니까?
그러나 첫 번째 단계는 발생하지 않습니다.
왜 첫 번째 단계가 발생하지 않습니까?
예상되는 것은
입니다. 1. 입력을 입력하십시오.
2. 입력을 읽고 입력 값을 반환하십시오.
3. sizeof 값을 확인하십시오.
4. sizeof 값을 인쇄하십시오.sizeof가 예상대로 작동하지 않는 이유는 무엇입니까?
그러나 첫 번째 단계는 발생하지 않습니다.
왜 첫 번째 단계가 발생하지 않습니까?
sizeof()
함수는 대괄호 안에있는 내용을 평가하지 않습니다. 유형을보고 크기를 반환합니다. 이것은 완벽하게 안전하다 : 그 답을 알 수있는 식을 계산할 필요가 없기 때문에 그것은, 1
를 반환합니다
char *ptr = NULL; // NULL ponter!
printf("%d", sizeof(*ptr));
.
"이것은 완전히 안전합니다."-> 실제로는 아닙니다. 'sizeof'의 결과 타입은'size_t'입니다. 일치하는'printf()'지정자는''% d ''이 아니라''% zu''입니다. – chux
getchar()
반환 유형이 int
이기 때문에 char
이 아닙니다. sizeof(int)
은 플랫폼에 따라 4입니다.
또한 %zu
을 사용하여 size_t
값을 인쇄해야합니다. 잘못된 형식 지정자를 사용하는 것은 기술적으로 undefined behaviour입니다.
예상되는 것은 1. 입력을 입력하십시오. 2. 입력을 읽고 입력 값을 반환합니다. 3. sizeof 값을 평가하십시오. 4. sizeof 값을 인쇄하십시오.
그러나 첫 번째 단계는 발생하지 않습니다. 왜 첫 번째 단계가 발생하지 않습니까?
매우 예외가 있기 때문에 sizeof
연산자는 피연산자를 평가하지 않습니다. 귀하의 사용은 예외 사항 중 하나가 아닙니다. 평가하지 않는 경우 getchar()
은 getchar()
을 의미하지 않습니다.
어떤 경우에도 코드에서 기대하는 것이 확실하지 않습니다. getchar()
이 호출 되더라도이라고해도 결과는 항상 입력에 종속되지 않는 동일한 유형 (int
)입니다.
@P.P.의 의견에도주의하십시오. printf()
형식이 인쇄 할 데이터 형식과 일치하지 않습니다 (size_t
). 그가 보았을 때, printf()
호출은 결과로 정의되지 않은 동작을합니다.
C에서 sizeof 연산자는 가변 크기 배열 (VLA)에 대해서만 런타임에 평가됩니다. 그 외의 경우에는 오퍼레이터가 피연산자를 평가하거나 평가하지 않습니다. 표현식의 유형을 추론하고 추론 된 유형의 객체 크기를 반환합니다. $ gcc가 -o 임시 temp.c [steamboy의 ics_client @ ICS] [ICS @ steamboy ics_client] $ ./temp 4 ICS @ steamboy ics_client] $을에 무엇 플랫폼 :
나는이 얻을? – octopusgrabbus
또한 문자열 끝에 '\ n'을 추가해야합니다. –