2016-03-31 17 views
0
char str1[]="abc"; 
char str2[]="abc"; 

if (str1==str2) 
    printf("Yes") 
else 
    printf("No"); 

私はCをリフレッシュしています。上記のコードは「はい」を返さないでしょうか? str1とstr2は配列の最初の要素を指しているので(文字a)、同じであると思います。私が何かを逃している場合は助言してください。Cの文字列の比較

+4

いいえ。アドレスを比較しています。それがstrcmpが存在する理由です。 – OldProgrammer

+0

は、コンパイラが最適化として文字列インターンリングを行うかどうかによって実際に決まります – isedev

+0

ポインタが何であるかを調べる必要があります。 –

答えて

0

char配列の変数名は、配列の最初の要素のアドレスへのポインタに相当します。したがって、あなたが比較しているのはポインタです。メモリ内の2つの変数のアドレスが等しくないため、これらは等価ではありません。

+0

これが取得されました。ご協力いただきありがとうございます。 –

0

技術的には、文字列アドレスを比較しています。したがって、最適化がなければ、期待される答えは「いいえ」(2つの異なる文字列、したがって2つのアドレス)です。

しかし、現代のコンパイラのほとんどは、文字列のインターナショナル(同一の定数文字列をマージする)を実行します。その場合、答えは "はい"になります。これは文字列リテラルに対してのみ起こることに注意してください。例えば

、GCC 4.9.2はデフォルトでこれを行う:変数char ptr1[]char ptr2[]を宣言するとき

#include <stdio.h> 
int 
main() 
{ 
    char *ptr1 = "abc"; 
    char *ptr2 = "abc"; 
    printf("%p\n%p\n",ptr1,ptr2); 
    if (ptr1 == ptr2) printf("yes\n"); 
} 

gcc -o /tmp/file /tmp/file.c 

/tmp/file 
0x400660 
0x400660 
yes 

興味深いことに、挙動(すなわちないインターン)異なっています。その場合、コンパイラは実際には文字列をスタックに配置するからです(here参照)。

コメントに記載されているように、文字列を比較する適切な方法はstrcmpと関連する関数です。

+0

*すべての*ケースでは、質問に投稿されたコードに答えが「いいえ」になります。あなたは別の質問に答えているようだ... – immibis

+0

ええ、確かに、私は一緒に行ったように私はそれを考え出していた:) – isedev