void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
Mengapa hasilnya No, not equal?
void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
Mengapa hasilnya No, not equal?
Jawaban:
Yang Anda bandingkan adalah dua alamat memori untuk string berbeda, yang disimpan di lokasi berbeda. Melakukannya pada dasarnya terlihat seperti ini:
if(0x00403064 == 0x002D316A) // Two memory locations
{
printf("Yes, equal");
}
Gunakan kode berikut untuk membandingkan dua nilai string:
#include <string.h>
...
if(strcmp("a", "a") == 0)
{
// Equal
}
Selain itu, "a" == "a"mungkin memang mengembalikan true, tergantung pada kompiler Anda, yang dapat menggabungkan string yang sama pada waktu kompilasi menjadi satu untuk menghemat ruang.
Saat Anda membandingkan dua nilai karakter (yang bukan penunjuk), ini adalah perbandingan numerik. Sebagai contoh:
'a' == 'a' // always true
-fmerge-constantsdan -fno-merge-constantsuntuk mengaktifkan / menonaktifkan string dan penggabungan konstan floating-point di seluruh unit terjemahan, meskipun pada beberapa GCC tampaknya penggabungan konstan selalu diaktifkan terlepas dari opsi itu.
inttipe. :-) Selain itu, pointer tidak harus berupa nilai numerik.
intapakah numerik juga, bukan? Tapi saya pikir karakter itu Byte. Int adalah 4 byte. Pointer itu sendiri adalah bilangan bulat juga. Mereka berisi alamat sekumpulan data (data yang memang tidak harus numerik).
'a' == 'A' // not true... MySQL sangat berbeda.
Saya agak terlambat ke pesta, tetapi saya akan tetap menjawab; secara teknis bit yang sama, tetapi dari perspektif yang sedikit berbeda (C bahasa di bawah):
Dalam C, ekspresi "a"menunjukkan literal string , yang merupakan array statis tanpa nama const char, dengan panjang dua - array terdiri dari karakter 'a'dan '\0'- karakter null yang mengakhiri menandakan akhir string.
Namun, di C, dengan cara yang sama Anda tidak bisa meneruskan array ke fungsi berdasarkan nilai - atau menetapkan nilai padanya ( setelah inisialisasi ) - tidak ada operator yang kelebihan beban ==untuk array, jadi tidak mungkin membandingkannya secara langsung. Mempertimbangkan
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
Jika ==tidak membandingkan array, lalu apa yang sebenarnya dilakukannya? Di C, di hampir semua konteks - termasuk yang satu ini - array meluruh menjadi pointer (yang mengarah ke elemen pertama dari array) - dan membandingkan pointer untuk persamaan melakukan apa yang Anda harapkan. Sangat efektif, saat melakukan ini
"a" == "a"
Anda sebenarnya membandingkan alamat karakter pertama dalam dua larik tanpa nama . Menurut standar C, perbandingan tersebut dapat menghasilkan benar atau salah (yaitu 1 atau 0) - "a"s sebenarnya dapat menunjukkan larik yang sama atau dua larik yang sama sekali tidak terkait. Dalam istilah teknis, nilai yang dihasilkan tidak ditentukan , artinya perbandingan diperbolehkan (yaitu bukan perilaku tidak terdefinisi atau kesalahan sintaksis), tetapi salah satu nilai tersebut valid dan implementasi (kompilator Anda) tidak diperlukan untuk mendokumentasikan apa yang sebenarnya akan terjadi.
Seperti yang telah ditunjukkan orang lain, untuk membandingkan "string c" (yaitu string yang diakhiri dengan karakter null) Anda menggunakan fungsi kemudahan yang strcmpditemukan di file header standar string.h. Fungsi tersebut memiliki nilai kembalian 0untuk string yang sama; dianggap praktik yang baik untuk secara eksplisit membandingkan nilai yang dikembalikan 0daripada menggunakan operator `! ´, yaitu
strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2)
Menurut C99 (Bagian 6.4.5 / 6)
String Literals
Tidak ditentukan apakah array ini berbeda asalkan elemennya memiliki nilai yang sesuai .
Jadi dalam kasus ini tidak ditentukan apakah keduanya "a"berbeda. Kompiler yang dioptimalkan bisa menyimpan satu "a"di lokasi hanya-baca dan kedua referensi bisa merujuk ke sana.
Lihat hasilnya di gcc di sini
Karena keduanya terpisah const char*, pointer, tidak ada nilai aktual. Anda mengatakan sesuatu seperti 0x019181217 == 0x0089178216yang tentu saja mengembalikan TIDAK
Gunakan strcmp()sebagai ganti==
Sederhananya, C tidak memiliki operator perbandingan string bawaan. Ini tidak dapat membandingkan string dengan cara ini.
Sebaliknya, string dibandingkan menggunakan rutinitas pustaka standar seperti strcmp () atau dengan menulis kode untuk mengulang setiap karakter dalam string.
Di C, string teks dalam tanda kutip ganda mengembalikan pointer ke string. Contoh Anda adalah membandingkan pointer, dan tampaknya kedua versi string Anda ada di alamat yang berbeda.
Tapi itu tidak membandingkan string itu sendiri, seperti yang Anda harapkan.
Pointer.
Yang pertama "a"adalah penunjuk ke string ASCII yang diakhiri dengan null.
Yang kedua "a"adalah penunjuk ke string ASCII lain yang diakhiri dengan null.
Jika Anda menggunakan kompiler 32-bit, saya harapkan "a"=="a"-4. Saya baru saja mencobanya dengan tcc / Win32, dan saya mengerti "a"=="a"-2. Baiklah...
strcmpuntuk menjalankan beberapa byte sekaligus. Beberapa kompiler melakukannya, beberapa tidak, beberapa melakukannya hanya untuk string yang lebih panjang dari beberapa minimum ...
pertanyaan ini menetapkan jejak penjelasan yang sangat baik untuk semua pemula ....
izinkan saya juga berkontribusi untuk itu .....
seperti yang dijelaskan semua orang di atas, mengapa Anda mendapatkan keluaran seperti itu.
sekarang jika Anda menginginkan prog Anda. Untuk mencetak "ya sama" lalu
baik digunakan
if(strcmp("a", "a") == 0)
{
}
atau
jangan gunakan "a" sebagai string, gunakan sebagai karakter ....
if('a'=='a')
{
printf ("yes Equal");
}
dalam karakter C adalah 1 byte bilangan bulat pendek .......
'a', sebenarnya adalah bilangan bulat.
Beberapa kompiler memiliki opsi 'merge string' yang dapat Anda gunakan untuk memaksa semua string konstan memiliki alamat yang sama. Jika Anda akan menggunakan itu, "a" == "a"akan true.
jika perbandingan antar karakter selalu dalam satu kutipan, mis
if('a' == 'a')
dan C tidak dapat mendukung perbandingan string seperti "abc" == "abc"
Selesai dengan strcmp("abc","abc")
Orang ini tidak menggunakan variabel. Sebagai gantinya, dia menggunakan larik teks sementara: adan a. Alasan mengapa
void main()
{
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
tidak bekerja tentu saja, adalah bahwa Anda tidak membandingkan variabel.
Jika Anda ingin membuat variabel seperti:
char * text = "a";
char * text2 = "a";
maka Anda bisa membandingkan textdengan text2, dan itu harus benar
Mungkin Anda tidak boleh lupa menggunakan {dan }=)
void main() {
if("a" == "a")
{
printf("Yes, equal");
}
else
{
printf("No, not equal");
}
}
void main??? Ew ...