문자열을 포인터 또는 리터럴로 전달할 때 strcmp() 반환 값이 일치하지 않음
는 요를 놀고 있었습니다.strcmp이것을 알아차렸을 때 코드는 다음과 같습니다.
#include <string.h>
#include <stdio.h>
int main(){
//passing strings directly
printf("%d\n", strcmp("ahmad", "fatema"));
//passing strings as pointers
char *a= "ahmad";
char *b= "fatema";
printf("%d\n",strcmp(a,b));
return 0;
}
출력은 다음과 같습니다.
-1
-5
말아야 할strcmp똑같이 일합니까?까로 할 때 입니까?"ahmad"또는 로서char* a = "ahmad" 됩니다.
TL :DR: 사용gcc -fno-builtin-strcmp그렇게strcmp()다와 되지 않습니다.__builtin_strcmp(). 최적화가 비활성화되면 GCC는 문장 간이 아니라 하나의 문장 내에서만 일정한 전파를 수행할 수 있습니다.실제 라이브러리 버전은 다른 문자를 뺀 것입니다. 컴파일 시간 평가는 결과를 ISO C에서 요구하거나 보장하지 않는 1 / 0 / -1로 정규화합니다.
컴파일러 최적화의 결과를 볼 수 있을 것입니다.gcc를 사용하여 godbolt로 코드를 테스트하면,-O0다,준라고 첫 를 볼 수 .strcmp:
movl $-1, %esi #,
movl $.LC0, %edi #,
movl $0, %eax #,
call printf #
당신이 상수를 strcmp를 위한 인수로 사용하기 때문에 컴파일러는 상수 접기를 수행하고 컴파일 시간에 고유한 컴파일러를 호출하고 생성할 수 있습니다.-1를 할 도 없고strcmp더에서와 에.strcmp.
두 에는 합니다에 합니다.strcmp:
call strcmp #
movl %eax, %esi # D.2047,
movl $.LC0, %edi #,
movl $0, %eax #,
call printf #
이것은 gcc가 strcmp를 위해 내장되어 있다는 사실과 일치합니다.gcc는 일정하게 접히는 동안 사용됩니다.
최적화 수준 이상을 사용하여 추가 테스트하는 경우 gcc두 접을 수 그 과 같습니다.-1두 두:
movl $-1, %esi #,
movl $.LC0, %edi #,
xorl %eax, %eax #
call printf #
movl $-1, %esi #,
movl $.LC0, %edi #,
xorl %eax, %eax #
call printf #
을 더 많이 됩니다를 할 수 .a그리고.b다의 할 수 .strcmp이 경우는 물론 컴파일 시간 동안에도.
우리는 그것을 확인할 수 있습니다.gcc-fno-built-flag로 빌드하여 내장 기능을 사용하고 있습니다.strcmp모든 경우에 대해 생성됩니다.
clang다를 하여 전혀 .-O0그러나 접을 것입니다.-O1둘 다 위에 있습니다.
로 , C99 을을 알수.7.21.4.2strcmp 함수는 다음과 같이 말합니다(empassis mine).
int strcmp(const char *s1, const char *s2);strcmp 함수는 s1이 가리키는 문자열이 s2가 가리키는 문자열보다 크거나 같거나 작으므로 0보다 큰 정수를 반환합니다.
는 technosurus 는합니다.strcmp문자열이 서명되지 않은 char로 구성된 것처럼 취급하도록 지정되어 있으며, 이는 C99 아래에서 다루어지고 있습니다.7.21.1다음과 같은 내용이 있습니다.
이 하위 절의 모든 기능에 대해 각 문자는 서명되지 않은 문자 형식을 가진 것으로 해석되어야 합니다(따라서 가능한 모든 개체 표현은 유효하고 다른 값을 갖습니다).
내 생각에 당신은 당신이 그 가치를 돌려준 것을 믿는다고 생각합니다.strcmp함수 사양에 의해 정의되지 않은 방식으로 전달된 입력 문자열에 어떻게든 의존해야 합니다.이것은 옳지 않습니다.예를 들어 POSIX 정의를 참조하십시오.
http://pubs.opengroup.org/onlinepubs/009695399/functions/strcmp.html
완료 시 strcmp()는 s1이 가리키는 문자열이 s2가 가리키는 문자열보다 크거나 같거나 작으면 0보다 크거나 같거나 작은 정수를 반환해야 합니다.
이것이 바로 당신이 보고 있는 것입니다.구현은 정확한 수익률 값을 보장할 필요가 없습니다. 단지 0보다 작거나, 0과 같거나, 또는 0보다 큰 경우만 해당됩니다.
언급URL : https://stackoverflow.com/questions/27751221/inconsistent-strcmp-return-value-when-passing-strings-as-pointers-or-as-litera
'programing' 카테고리의 다른 글
| 앵귤러는?ui-router를 사용하는 JS는 $state를 계속 발사합니다.ChangeStart 이벤트? (0) | 2023.09.23 |
|---|---|
| 해스켈: 문자열로 변환 (0) | 2023.09.23 |
| libavcodec을 이용한 mPEGts 컨테이너의 원시 H264 프레임 (0) | 2023.09.23 |
| SQL Server localDB를 최신 버전으로 업그레이드하려면 어떻게 해야 합니까? (0) | 2023.09.23 |
| Oracle에서 문자열을 숫자로 선택 (0) | 2023.09.23 |