C에서 왜“a”! =“a”입니까?
void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
왜 출력 No, not equal
입니까?
비교하는 것은 다른 문자열에 대한 두 개의 메모리 주소이며 다른 위치에 저장됩니다. 그렇게하는 것은 본질적으로 다음과 같습니다 :
if(0x00403064 == 0x002D316A) // Two memory locations
{
printf("Yes, equal");
}
다음 코드를 사용하여 두 문자열 값을 비교하십시오.
#include <string.h>
...
if(strcmp("a", "a") == 0)
{
// Equal
}
또한 "a" == "a"
컴파일러에 따라 컴파일 시간에 동일한 문자열을 하나로 결합하여 공간을 절약 할 수있는 참으로 true를 반환 할 수 있습니다.
포인터가 아닌 두 문자 값을 비교할 때는 숫자 비교입니다. 예를 들면 다음과 같습니다.
'a' == 'a' // always true
나는 파티에 조금 늦었지만 어쨌든 대답 할 것입니다. 기술적으로 동일한 비트이지만 약간 다른 관점 (아래 C 용어) :
C에서, 상기 식은 "a"
나타낸다 문자열 리터럴 정적 이름 배열, const char
이들의 길이, - 어레이는 문자로 구성 'a'
하고 '\0'
- 종단 NULL 문자는 문자열의 끝에 신호를 보낸다.
그러나 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
는 IF ==
배열을 비교되지 않으며, 실제로 다음, 무엇을해야합니까? C에서는이 컨텍스트를 포함하여 거의 모든 컨텍스트에서 배열이 포인터로 붕괴 합니다 (배열의 첫 번째 요소를 가리킴). 포인터를 동일하게 비교하면 예상대로됩니다. 이렇게하면 효과적으로
"a" == "a"
실제로 이름없는 두 배열에서 첫 문자의 주소를 비교하고 있습니다 . C 표준에 따르면, 비교는 true 또는 false (즉, 1 또는 0)를 생성 "a"
할 수 있습니다. -s는 실제로 동일한 배열 또는 완전히 관련되지 않은 2 개의 배열을 나타낼 수 있습니다. 기술적 인 측면에서, 결과 값은 지정되지 않습니다. 즉, 비교가 허용되지만 (즉, 정의 되지 않은 동작 또는 구문 오류가 아님), 값이 유효하고 구현 (컴파일러)이 실제로 발생할 결과를 문서화하지 않아도됩니다.
다른 사람들이 지적했듯이 "c 문자열"(예 : 널 문자로 끝나는 문자열)을 비교하려면 strcmp
표준 헤더 파일에 있는 편의 기능을 사용 하십시오 string.h
. 함수는 0
동일한 문자열 에 대한 리턴 값 을 갖습니다. 0
연산자`! ´를 사용하는 대신 반환 값을 명시 적으로 비교하는 것이 좋습니다 .
strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2)
C99 (섹션 6.4.5 / 6)에 따름
문자열 리터럴
해당 배열에 적절한 값이있는 경우 이러한 배열이 고유한지 여부는 지정되지 않습니다 .
따라서이 경우 두 가지 "a"
가 서로 다른지 여부는 지정되지 않습니다. 최적화 된 컴파일러 "a"
는 읽기 전용 위치에 단일 을 유지할 수 있으며 두 참조 모두이를 참조 할 수 있습니다.
gcc의 출력을 확인 하십시오.
그것들은 2 개의 분리 된 const char*
포인터 이기 때문에 실제 값이 없습니다. 0x019181217 == 0x0089178216
물론 NO를 반환하는 것과 같은 것을 말하고 있습니다.
strcmp()
대신에 사용==
간단히 말해 C에는 기본 제공 문자열 비교 연산자가 없습니다. 이 방법으로 문자열을 비교할 수 없습니다.
대신 문자열은 strcmp ()와 같은 표준 라이브러리 루틴을 사용하거나 문자열의 각 문자를 반복하는 코드를 작성하여 비교됩니다.
C에서 큰 따옴표로 묶인 텍스트 문자열은 문자열에 대한 포인터를 반환합니다. 귀하의 예는 포인터를 비교하고 있으며 분명히 두 버전의 문자열이 다른 주소에 존재합니다.
그러나 예상대로 문자열 자체를 비교하지는 않습니다.
포인터.
첫 번째 "a"
는 null로 끝나는 ASCII 문자열에 대한 포인터입니다.
The second "a"
is a pointer to another null-terminated ASCII string.
If you're using a 32-bit compiler, I'd expect "a"=="a"-4
. I've just tried it with tcc/Win32 though, and I get "a"=="a"-2
. Oh well...
You're comparing two memory address, so the result is not always going to be true. Did you try if('a' == 'a'){...}
?
this question sets very good trail of explanation for all the beginers....
let me also contribute to it.....
as everybody above explained about , why you getting such output.
now if you want your prog. To print "yes equal" then
either use
if(strcmp("a", "a") == 0)
{
}
or
do not use "a" as strings, use them as characters....
if('a'=='a')
{
printf ("yes Equal");
}
in C characters are 1 byte short integer.......
Some compilers have 'merge strings' option that you can use to force all constant strings to have the same address. If you would use that, "a" == "a"
would be true
.
if comparision between character is always in single quote, e.g.
if('a' == 'a')
and C can't support string comparision like "abc" == "abc"
It's done with strcmp("abc","abc")
This guy does not use variables. Instead, he uses temporarily text arrays: a
and a
. The reason why
void main()
{
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
does not work of course, is that you do not compare variables.
If you would create variables like:
char* text = "a";
char* text2 = "a";
then you could compare text
with text2
, and it should be true
Maybe you shouldn't forget to use {
and }
=)
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
'development' 카테고리의 다른 글
0.ToString (“#. ##”)이 0.00 또는 적어도 0 대신 빈 문자열을 반환하는 이유는 무엇입니까? (0) | 2020.07.30 |
---|---|
Emacs에서 코드 접기 효과를 얻는 방법? (0) | 2020.07.30 |
기본 FlatList 코드에서 경고가 발생 함-기본 반응 (0) | 2020.07.30 |
iOS의 UIView에서 응용 프로그램 문서 폴더로 이미지 저장 (0) | 2020.07.30 |
Java AES / CBC 암호 해독 후 초기 바이트가 올바르지 않습니다. (0) | 2020.07.30 |