source

왜 "a"가 C로!= "a"가 되는 거죠?

goodcode 2022. 9. 1. 23:15
반응형

왜 "a"가 C로!= "a"가 되는 거죠?

void main() {
    if("a" == "a")
      printf("Yes, equal");  
    else
      printf("No, not equal");
}

은 왜 " " 입니다.No, not equal

비교하고 있는 것은, 다른 장소에 격납되어 있는, 다른 문자열의 2개의 메모리주소입니다.기본적으로는 다음과 같습니다.

if(0x00403064 == 0x002D316A) // Two memory locations
{
    printf("Yes, equal");
}

다음 코드를 사용하여 두 문자열 값을 비교합니다.

#include <string.h>

...

if(strcmp("a", "a") == 0)
{
    // Equal
}

★★★★★"a" == "a"사실대로 말하다컴파일 시 동일한 문자열을 1개로 조합하여 공간을 절약할 수 있습니다.

포인터가 아닌 두 문자 값을 비교할 때는 숫자 비교가 됩니다.예를 들어 다음과 같습니다.

'a' == 'a' // always true

파티에는 조금 늦었지만 어쨌든 대답하겠습니다.엄밀히 말하면 같은 부분이지만, 조금 다른 관점(아래의 용어 참조)입니다.

C는 C라고 ."a"스트링 리터럴을 나타냅니다.이것은, 다음의 스태틱한 이름 없는 배열입니다.const char, 2자, 2자, 2자, 2자, 3자, 3자, 3자, 4자, 4자, 4자, 4자, 4자, 4자, 4자, 4자, 4자, 4자, 4자, 4'a' ★★★★★★★★★★★★★★★★★」'\0' 늘 - 끝의 늘 문자는 문자열의 끝을 나타냅니다.

단, C에서는 어레이를 값으로 함수에 전달할 수 없거나 (초기화 후) 을 할당할 수 없는 것과 마찬가지로 오버로드된 연산자는 없습니다.==어레이의 경우는, 직접 비교할 수 없습니다.

int a1[] = {1, 2, 3};
int a2[] = {3, 4, 5};
a1 == a2 // is this meaningful? Yes and no; it *does* compare the arrays for
         // "identity", but not for their values. In this case the result
         // is always false, because the arrays (a1 and a2) are distinct objects

경우,==어레이를 비교하는 것이 아니라 실제로 어떤 역할을 하는 걸까요?C에서는, 이것을 포함한 거의 모든 콘텍스트에서, 어레이는 포인터(어레이의 첫 번째 요소를 가리키는 포인트)로 붕괴해, 동등성을 위한 포인터를 비교하는 것은, 예상대로입니다.이 작업을 할 때

"a" == "a"

이름 없는배열에 있는 첫 번째 문자의 주소를 실제로 비교하고 있습니다.C 표준에 따르면 비교는 참 또는 거짓(즉, 1 또는 0)을 산출할 수 있다."a"는 실제로는 같은 어레이 또는 전혀 관련이 없는2개의 어레이를 나타낼 수 있습니다.기술적인 용어로 결과 값은 지정되지 않았습니다.즉, 비교는 허용되지만(즉, 정의되지 않은 동작이나 구문 오류가 아님), 어느 하나의 값은 유효하며 실제 발생하는 일을 기록하기 위해 구현(사용하는 컴파일러)이 필요하지 않습니다.

처럼 'c 문자열 'c 문자열'(null, null, null, null, null, null, null, null, null)을 사용합니다.strcmp표준 헤더 파일에 있음string.h함수의 반환값은 다음과 같습니다.0동일한 문자열의 경우 반환값을 명시적으로 비교하는 것이 좋은 관행으로 간주됩니다.0연산자 '!'를 사용하는 대신 사용합니다.

strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2)

C99(섹션 6.4.5/6)에 따라

문자열 리터럴

요소의 값이 적절한 경우 이들 배열이 구별되는지 여부는 지정되지 않았습니다.

따라서 이 경우, 양쪽 모두 특정되지 않습니다."a"는 구별됩니다.최적화된 컴파일러는 1개의 컴파일러를 유지할 수 있습니다."a"두 참조 모두 참조할 수 있습니다.

여기서 gcc의 출력을 확인하십시오.

두 개가 따로 있기 때문에const char*의 포인터, 실제 값은 없습니다.당신은 이렇게 말하고 있다.0x019181217 == 0x0089178216물론 NO를 반환한다.

strcmp()==

간단히 말해 C에는 문자열 비교 연산자가 내장되어 있지 않습니다.이 방법으로는 문자열을 비교할 수 없습니다.

대신 strcmp()와 같은 표준 라이브러리 루틴을 사용하거나 문자열 내의 각 문자를 루프하는 코드를 쓰는 방식으로 문자열을 비교합니다.

C에서는 큰따옴표로 둘러싸인 텍스트 문자열이 문자열로 포인터를 반환합니다.이 예에서는 포인터를 비교하고 있으며, 두 버전의 문자열이 다른 주소에 존재하는 것 같습니다.

그러나 그것은 여러분이 예상한 것처럼 현 자체를 비교하는 것이 아닙니다.

포인터

번째 ★★★★★★★★★★★★★★."a"ASCII를 사용하다

번째 두 the the"a"ASCII를 사용하다

컴파일러를 컴파일러가 "a"=="a"-4해 본 「tcc/Win32」라고 하는 결과가 "a"=="a"-2, 뭐,, ....

두 개의 메모리 주소를 비교하고 있기 때문에 결과가 항상 맞는 것은 아닙니다.해보셨어요?if('a' == 'a'){...}

이 질문은 모든 시작자에게 매우 좋은 설명의 흔적을 남긴다...
★★★★★★★★★★...

위에서 설명한 바와 같이, 왜 그런 출력을 얻을 수 있는지에 대해 설명합니다.

프로그라도 원하신다면요yes equal을 인쇄하려면

어느쪽이든 사용

if(strcmp("a", "a") == 0)
{

}

or or or openicle.
문자열로 "a"를 사용하지 말고 문자로 사용합니다.

if('a'=='a')  
{  
printf ("yes Equal");  
}  

C 문자는 1바이트 짧은 정수......

일부 컴파일러에는 모든 상수 문자열이 동일한 주소를 갖도록 강제하기 위해 사용할 수 있는 '문자열 병합' 옵션이 있습니다.걸걸면면면 면면 면면"a" == "a"true.

문자 간 비교가 항상 작은 따옴표(예:

if('a' == 'a')

C는 C와 같이 비교를 하지 않습니다."abc" == "abc"

이이 it it it strcmp("abc","abc")

이 사람은 변수를 사용하지 않습니다.일시적으로 배열을 합니다.a ★★★★★★★★★★★★★★★★★」a.의 이유이유

void main() 
{
    if("a" == "a")
      printf("Yes, equal");  
    else
      printf("No, not equal");
}

변수를 비교하지 않는다는 것입니다.
다음과 같이 합니다.

a";char* 텍트 = "a";
= "char* text2 = "a";

가 되겠네요.texttext2그리고 그것은 사실이어야 한다.

{ ★★★★★★★★★★★★★★★★★」}=

void main() {
    if("a" == "a")
    {
      printf("Yes, equal");
    }
    else
    {
      printf("No, not equal");
    }
}

언급URL : https://stackoverflow.com/questions/4843640/why-is-a-a-in-c

반응형