char str1[]="abc";
char str2[]="abc";
if (str1==str2)
printf("Yes")
else
printf("No");
私はCをリフレッシュしています。上記のコードは「はい」を返さないでしょうか? str1とstr2は配列の最初の要素を指しているので(文字a)、同じであると思います。私が何かを逃している場合は助言してください。Cの文字列の比較
char str1[]="abc";
char str2[]="abc";
if (str1==str2)
printf("Yes")
else
printf("No");
私はCをリフレッシュしています。上記のコードは「はい」を返さないでしょうか? str1とstr2は配列の最初の要素を指しているので(文字a)、同じであると思います。私が何かを逃している場合は助言してください。Cの文字列の比較
char配列の変数名は、配列の最初の要素のアドレスへのポインタに相当します。したがって、あなたが比較しているのはポインタです。メモリ内の2つの変数のアドレスが等しくないため、これらは等価ではありません。
これが取得されました。ご協力いただきありがとうございます。 –
技術的には、文字列アドレスを比較しています。したがって、最適化がなければ、期待される答えは「いいえ」(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
と関連する関数です。
いいえ。アドレスを比較しています。それがstrcmpが存在する理由です。 – OldProgrammer
は、コンパイラが最適化として文字列インターンリングを行うかどうかによって実際に決まります – isedev
ポインタが何であるかを調べる必要があります。 –