code

'\ 0'은 거짓,“\ 0”은 참

codestyles 2021. 1. 5. 08:06
반응형

'\ 0'은 거짓,“\ 0”은 참


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에서 다르게 평가?

clang 버전 3.8.0


C에서 문자열 리터럴이 작동하는 방식을 상기하십시오. "\0"두 개의 0 바이트 (요청한 바이트와 끝에 암시 적 바이트)를 포함하는 문자 배열입니다. if테스트를 위해 평가되면 첫 번째 문자에 대한 포인터로 사라집니다. 이 포인터는 NULL이 아니므로 조건으로 사용될 때 참으로 간주됩니다.

'\0'숫자 0이며 0. 0 인 정수이므로 조건으로 사용하면 거짓으로 간주됩니다.


우선 C에서는

  • 0은 거짓이고 0이 아닌 것은 참입니다.
  • 포인터 유형의 경우 NULL는 false이고 non- NULL는 true입니다.

'\0'다른 사람들이 말했듯이는 정수 리터럴 0동일 하므로 거짓입니다 (위의 첫 번째 글 머리 기호에서 이유를 확인하십시오).

"\0"\0문자 를 포함하는 문자열 리터럴입니다 (하나는 명시 적으로 추가하고 다른 하나는 암시 적이며 컴파일러에 의해 추가됨). 문자열 리터럴은 읽기 전용 메모리에 저장됩니다. 을 사용하면 "\0"첫 번째 요소 에 대한 포인터로 변환됩니다 . 이를 일반적으로 " 어레이 붕괴 "라고합니다. (이것이 char* str = "string";작동 하는 이유입니다 ).

따라서 문자열 literal의 첫 번째 문자 주소를 효과적으로 확인하고 있습니다 . 문자열 리터럴의 주소는 항상 non- NULL이므로 if는 항상 true입니다 (위의 두 번째 글 머리 기호 참조).


: 이러한 어레이의 "붕괴"가 항상 발생하는 것은 아닙니다. 포인터로 붕괴되지 않는 배열에 대한 예외를 참조하십시오 .


'\0'숫자 : 0이므로 false ( 0= false, !0= true) 로 평가됩니다 .

그러나 "\0"실제 문자열이 저장되는 읽기 전용 섹션에 대한 포인터이며 포인터는 NULL사실 이 아닙니다 .


먼저 두 조건을 살펴보면 '\0'정수 유형의 상수가 있는데, 이는 null 문자 C를 나타내며 0. While "\0"은 2 바이트를 포함하는 문자열 리터럴입니다. 하나는 지정되고 null 종결 자 바이트는 암시 적으로 추가됩니다. 문자열 리터럴이므로 포인터는 NULL.

둘째, C에서 if문장 의 조건에 대해 0이 아닌 모든 것은로 평가 true되고 0은로 평가됩니다 false.

이 규칙에 따르면,이 분명있을 것 '\0'입니다 false, 그리고 "\0"로 평가 true.


우선, False의 16 진수 값은 0x000x00이 아닌 다른 값입니다.

"\0"문자와 '\0'끝에 널 (NULL) 종결 자가 있는 문자열입니다 . 따라서 2 바이트 배열을 가리키는 문자 포인터입니다 : ['\0', '\0']. 이 배열에서 첫 번째는 문자이고 다른 하나는 널 종료 자입니다.

최적화하지 않고 컴파일 한 후이 문자 포인터는이 두 바이트의 첫 번째 바이트를 가리키는 메모리의 주소에 임시로 할당됩니다. 이 주소는 예를 들어 0x18A616 진수 일 수 있습니다 . 따라서 컴파일러 (대부분)는 실제로이 두 값을 메모리에 씁니다. 문자열은 실제로 해당 문자열의 첫 번째 바이트 주소이기 때문에 식은로 해석됩니다 0x18A6 != false. 그래서 분명 0x18A6 != 0x00True입니다.

'\0'단순히 0x0016 진수입니다. 0x00 != 0x00거짓입니다.

이 답변은 16 비트 주소 지정을 사용하는 8 비트 데이터 아키텍처 용으로 작성되었습니다. 도움이 되었기를 바랍니다.


'\ 0'값이 0 인 문자입니다 . 문자열을 종료하는 데 사용됩니다. 그래서 그것은 거짓으로 간주됩니다.

"\ 0"null 또는 문자열 입니다. 문자열의 유일한 문자는 문자열을 종료하는 null 문자이므로 true로 간주됩니다.


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

  1. C에서 if (condition) 작동
  2. C에서 문자 및 문자열 리터럴의 차이

1. C에서 if (condition)의 작동 if (condition)

C 언어에서 조건이 0 (0) 및 0이 아닌 기준에서 작동하는 경우.

주어진 조건의 결과가 0이면 C는 주어진 조건이 거짓이라고 간주합니다.

주어진 조건의 결과가 0이 아니면 C는 주어진 조건이 참이라고 간주합니다.

2. C에서 문자와 문자열 리터럴의 차이

C에서 문자열 리터럴은 큰 따옴표 ( "")로 묶인 문자이고 문자 리터럴은 작은 따옴표 ( '')로 묶인 문자이고 최소 길이는 1 자이고 최대 길이는 2 자입니다.

또 다른 중요한 점은 C에서 '\ 0'(null)을 int (Integer)로 변환하면 0 (0)을 얻지 만 "\ 0"을 암시 적으로 또는 명시 적으로 int로 변환 할 수 없다는 것입니다. "\ 0"은 문자열이고 '\ 0'은 문자이기 때문입니다.

그리고 문자열 IF 조건 작업 논리에 따라 조건이 0 또는 거짓을 반환하면 조건이 거짓임을 의미합니다. 조건이 0이 아닌 경우 조건이 참임을 의미합니다.

그래서, 포인트 1과 2에 따르면 마침내 우리는 결론을 내릴 수 있습니다.

if ( '\ 0') printf ( "\ '\ 0 \'! = 거짓 \ n"); // 조건이 거짓이 됨

if ( "\ 0") printf ( "\"\ 0 \ "! = false \ n"); // 조건이 참이 됨


'\ 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; 
}

간단한 것은 ATLEAST 0 (int)과 0.0 (float 또는 double)이 C에서 FALSE 값을 갖는다는 것입니다.

'\ 0'은 정수 0입니다.

"\0" is an array of characters. It does not matter that INSIDE the array how many Characters are there or what are those characters.

So, '\0' evaluates to 0 like 77-77 evaluates to 0. And 0 is false.

int x; x = '\0'; printf("X has a value : %d"); Output:


x has a value : 0

And the code:

if(0){printf("true");}

else{printf("false");}

Output:


false

ReferenceURL : https://stackoverflow.com/questions/36950552/0-evaluates-false-0-evaluates-true

반응형