source

'\0'은 false, '\0'은 true로 평가됩니다.

factcode 2022. 9. 1. 23:11
반응형

'\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」에합니다.00의 정수이기 때문에 조건으로 사용하면 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 이므로NULLif는 항상 참입니다(이유는 위의 두 번째 글머리 기호 참조).


: 어레이의 이러한 "감소"가 항상 발생하는 것은 아닙니다.포인터로 분해되지 않는 어레이의 예외를 참조해 주세요.

은 False 16입니다.0x000x00은 맞다.

"\0"로 Null ", Null "Terminator ", Null "Terminator" 를 합니다.'\0'그래서 2바이트 배열을 가리키는 입니다.['\0', '\0']이 배열에서는 첫 번째가 문자이고 다른 하나는 늘 터미네이터입니다.

컴파일 후(최적화하지 않고) 이 문자 포인터는 일시적으로 이들 2바이트 중 첫 번째 바이트를 가리키는 메모리 내의 주소에 할당됩니다.이 주소는 예를 들어 다음과 같습니다.0x18A6열여섯 살따라서 컴파일러(대부분)는 실제로 이 두 값을 메모리에 씁니다.는 그 첫 의 주소이기 에 이 은 "예"로 됩니다.0x18A6 != false0x18A6 != 0x00는는말말말말말

'\0' 말하면0x00열여섯 살 0x00 != 0x00짓입니니다다

이 답변은 16비트 어드레싱을 사용하는8비트 데이터 아키텍처에 대해 기술되어 있습니다.도움이 됐으면 좋겠어요.

'\0'0 false, false)로 평가됩니다0, = false!0= ★★★★

★★★★★★★★★★★★★★★★★."\0"되어 있는 는 "읽기 전용"이 .이 포인터는NULL에르고 사실이야.

C의 두 가지 다른 개념으로 위의 문제를 해결할 수 있습니다.

  1. C에서의 if(조건)의 동작
  2. 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

반응형