'\0'은 false, '\0'은 true로 평가됩니다.
K&R 섹션 5.5에서 설명한 프로그램에서 영감을 얻어:
void strcpy(char *s, char *t)
{
while(*s++ = *t++);
}
C 프로그램
if ('\0') { printf("\'\\0\' -> true \n"); }
else { printf("\'\\0\' -> false\n"); }
if ("\0") { printf("\"\\0\" -> true \n"); }
else { printf("\"\\0\" -> false\n"); }
인쇄하다
'\0' -> false
"\0" -> true
?는 왜?'\0'
★★★★★★★★★★★★★★★★★」"\0"
에르르 c c c c c c c?
clang 버전 3.8.0
이 C - "C"에서 해 주십시오."\0"
는 2개의 제로 바이트(요구한 바이트와 마지막에 암묵적인 바이트)를 포함하는 문자 배열입니다.「 」에 .if
테스트, 첫 번째 문자에 대한 포인터로 소멸합니다.이 포인터는 NULL이 아니므로 조건으로 사용할 경우 true로 간주됩니다.
'\0'
는 숫자 0 입니다.단순히 「0」에합니다.0
0의 정수이기 때문에 조건으로 사용하면 false로 간주됩니다.
우선, C에서는
- 0은 false이고 0이 아닌 것은 true입니다.
- 타입의 는, 「」입니다.
NULL
및 non-false가 아닌 non-to-입니다.NULL
정말이에요.
'\0'
리터럴이다, 즉 리터럴이다, 즉 리터럴이다, 리터럴이다, 리터럴이다, 리터럴이다, 리터럴이다0
따라서 거짓입니다(이유는 위의 첫 번째 글머리 기호 참조).
"\0"
는 2개의 2개의 2개의 2개의 2개의 입니다.\0
문자(명시적으로 추가한 문자 및 컴파일러에 의해 추가되는 암묵적인 문자)입니다.문자열 리터럴은 읽기 전용 메모리에 저장됩니다.를 사용하면 첫 번째† 요소에 대한 포인터로 변환됩니다.이를 일반적으로 "어레이 붕괴"라고 합니다.(이것이 바로 다음과 같은 것들이char* str = "string";
동작합니다).
따라서 문자열 리터럴의 첫 번째 문자의 주소를 효과적으로 확인할 수 있습니다.스트링 리터럴의 주소는 항상 non-time 이므로NULL
if는 항상 참입니다(이유는 위의 두 번째 글머리 기호 참조).
: 어레이의 이러한 "감소"가 항상 발생하는 것은 아닙니다†.포인터로 분해되지 않는 어레이의 예외를 참조해 주세요.
은 False 16입니다.0x00
0x00은 맞다.
"\0"
로 Null ", Null "Terminator ", Null "Terminator" 를 합니다.'\0'
그래서 2바이트 배열을 가리키는 입니다.['\0', '\0']
이 배열에서는 첫 번째가 문자이고 다른 하나는 늘 터미네이터입니다.
컴파일 후(최적화하지 않고) 이 문자 포인터는 일시적으로 이들 2바이트 중 첫 번째 바이트를 가리키는 메모리 내의 주소에 할당됩니다.이 주소는 예를 들어 다음과 같습니다.0x18A6
열여섯 살따라서 컴파일러(대부분)는 실제로 이 두 값을 메모리에 씁니다.는 그 첫 의 주소이기 에 이 은 "예"로 됩니다.0x18A6 != false
0x18A6 != 0x00
는는말말말말말
'\0'
말하면0x00
열여섯 살 0x00 != 0x00
짓입니니다다
이 답변은 16비트 어드레싱을 사용하는8비트 데이터 아키텍처에 대해 기술되어 있습니다.도움이 됐으면 좋겠어요.
'\0'
0
false, false)로 평가됩니다0
, = false!0
= ★★★★
★★★★★★★★★★★★★★★★★."\0"
되어 있는 는 "읽기 전용"이 .이 포인터는NULL
에르고 사실이야.
C의 두 가지 다른 개념으로 위의 문제를 해결할 수 있습니다.
- C에서의 if(조건)의 동작
- C에서의 문자와 문자열 리터럴의 차이
1. C의 if(조건)의 동작
C 언어에서 조건이 0(Zero) 및 0 이외의 베이스로 동작하는 경우.
특정 조건의 결과가 제로일 경우 C는 해당 조건이 false라고 간주합니다.
지정된 조건의 결과가 0이 아닌 경우 C는 해당 조건이 참이라고 간주합니다.
2. C의 문자 및 문자열 리터럴의 차이
C에서 문자열 리터럴은 큰따옴표("")로 둘러싸인 문자 리터럴은 작은따옴표("")로 둘러싸인 문자이며 최소 길이는 1자, 최대 길이는 2자입니다.
또 다른 중요한 점은 C에서 '\0'(늘)을 int(정수)로 변환하면 0(제로)이 되지만, '\0'을 암묵적으로 또는 명시적으로 int로 변환할 수 없다는 것입니다."\0"은 문자열이고 "\0"은 문자이기 때문입니다.
또한 문자열 IF 조건 작동 논리에 따르면 조건이 0 또는 false를 반환하면 조건이 false임을 나타냅니다.조건이 0이 아닌 경우 조건이 true임을 의미합니다.
따라서, 포인트 1과 포인트 2에 따라 최종적으로 다음과 같은 결론을 내릴 수 있습니다.
('\0') printfforc\'\0\'!= false\n"; //조건이 false가 되는 경우
("\0") printfflash\0"!= false\n"; //조건이 true가 되는 경우
두 가지 을 보면요, 이 두 가지 조건입니다.'\0'
는 정수늘 문자 C를 나타냅니다.은, NULL 문자 로, NULL 문자 C는, 「NULL 문자 C는, 「NULL 문자 C를 .C로 하다을 사용하다0
. 하는 동안에"\0"
는 스트링 리터럴로 지정된 바이트와 눌 터미네이터 바이트가 암묵적으로 추가된2 바이트를 포함합니다.는 스트링 리터럴로 할 수 .NULL
.
에서는 C의 으로 C의 경우if
이 아닌 은 '0'으로 됩니다.true
은 , 0으로 됩니다.false
.
이 규칙에 따르면, ...은 명확해질 것이다.'\0'
false
, , , , 입니다."\0"
라고 평가합니다.true
.
'\0'은 값이 0인 늘 문자입니다.문자열의 종료에 사용됩니다.그래서 거짓으로 간주됩니다.
"\0"은 늘 또는 빈 문자열입니다.문자열의 유일한 문자는 문자열을 끝내는 늘 문자입니다.그럼 사실인거군요.
'\0'은 숫자 0과 같은 문자입니다."\0"은 문자열이며 보통 문자열 끝에 "\0"을 추가합니다.조건문에는 "\0" 또는 "\0"을 사용하지 마십시오. 혼란스럽기 때문입니다.
다음의 사용법이 권장됩니다.
if (array[0] != 0)
{
}
if (p != 0)
{
}
if (p != NULL)
{
}
예를 들어 이것을 확인해 주세요.
#include <stdio.h>
int main()
{
printf( "string value\n" );
//the integer zero
printf( "0.........%d\n" , 0 );
//the char zero, but chars are very small ints, so it is also an int
//it just has some special syntax and conventions to allow it to seem
//like a character, it's actual value is 48, this is based on the
//ASCII standard, which you can look up on Wikipedia
printf( "'0'.......%d\n" , '0' );
//because it is an integer, you can add it together,
//'0'+'0' is the same as 48+48 , so it's value is 96
printf( "'0'+'0'...%d\n" , '0'+'0' );
//the null terminator, this indicates that it is the end of the string
//this is one of the conventions strings use, as a string is just an array
//of characters (in C, at least), it uses this value to know where the array
//ends, that way you don't have to lug around another variable to track
//how long your string is. The actual integer value of '\0' is zero.
printf( "'\\0'......%d\n" , '\0' );
//as stated, a string is just an array of characters, and arrays are tracked
//by the memory location of their first index. This means that a string is
//actually a pointer to the memory address that stores the first element of
//the string. We should get some large number, a memory address
printf( "\"0\".......%d\n" , "0" );
//a string is just an array of characters, so lets access the character
//in position zero of the array. it should be the character zero, which
//has an integer value of 48
printf( "\"0\"[0]....%d\n" , "0"[0] );
//and the same thing for the empty string
printf( "\"\\0\"[0]...%d\n" , "\0"[0] ); //equal to '\0'
//we also said a string is just a pointer, so we should be able to access
//the value it is pointing to (the first index of the array of characters)
//by using pointers
printf( "*\"0\"......%d\n" , *"0" );
return 0;
}
간단히 말해 최소 0(int)과 0.0(float 또는 double)의 값은 C입니다.
'\0'은 정수 0입니다.
"\0"은 문자 배열입니다.어레이의 내부에는 몇 개의 문자가 있는지, 또는 그 문자가 무엇인지에 관계없이 상관없습니다.
그래서 '\0'이 0으로 평가되고 77-77이 0으로 평가됩니다.그리고 0은 거짓이다.
int x; x = '\0'; printf("X has a value : %d");
★★★★
x의 값은 0입니다.
그리고 코드:
if(0){printf("true");}
else{printf("false");}
출력:
거짓의
언급URL : https://stackoverflow.com/questions/36950552/0-evaluates-false-0-evaluates-true
'source' 카테고리의 다른 글
Vue가 정의되지 않은 이유는 무엇입니까? (0) | 2022.09.01 |
---|---|
Java의 두 개체를 가능한 null 값과 비교합니다. (0) | 2022.09.01 |
32비트 정수가 오버플로우 했을 경우 64비트 길이 구조가 아닌 40비트 구조를 사용할 수 있습니까? (0) | 2022.09.01 |
페이지 새로고침 또는 직접 액세스 후 vuex-module에서 인증에 액세스할 수 없음 (0) | 2022.09.01 |
런타임에 Maven 아티팩트 버전 가져오기 (0) | 2022.09.01 |