Pertanyaan sederhana sebenarnya; apakah ada perbedaan antara nilai-nilai ini (dan apakah ada perbedaan antara BOOL dan bool)? Seorang rekan kerja menyebutkan bahwa mereka mengevaluasi hal-hal yang berbeda di Objective-C, tetapi ketika saya melihat typedef di masing-masing file .h mereka, YA / BENAR / benar semuanya didefinisikan sebagai 1
dan TIDAK / SALAH / salah semuanya didefinisikan sebagai 0
. Apakah memang ada perbedaan?
objective-c
boolean
Kevlar
sumber
sumber
Jawaban:
Tidak ada perbedaan praktis asalkan Anda menggunakan
BOOL
variabel sebagai boolean. C memproses ekspresi boolean berdasarkan pada apakah mereka mengevaluasi ke 0 atau tidak 0. Jadi:artinya sama dengan
itulah sebabnya Anda dapat mengevaluasi tipe atau ekspresi primitif apa pun sebagai tes boolean (termasuk, misalnya pointer). Perhatikan bahwa Anda harus melakukan yang pertama, bukan yang terakhir.
Perhatikan bahwa ada adalah perbedaan jika Anda menetapkan nilai tumpul untuk yang disebut
BOOL
variabel dan uji untuk nilai-nilai tertentu, sehingga selalu menggunakan mereka sebagai boolean dan hanya menetapkan mereka dari mereka#define
nilai-nilai.Yang penting, jangan pernah menguji boolean menggunakan perbandingan karakter - itu tidak hanya berisiko karena
someVar
dapat diberi nilai bukan nol yang bukan YA, tetapi, menurut saya yang lebih penting, gagal mengekspresikan maksud dengan benar:Dengan kata lain, gunakan konstruksi seperti yang dimaksudkan dan didokumentasikan untuk digunakan dan Anda akan menyelamatkan diri dari dunia yang terluka di C.
sumber
Saya percaya ada adalah perbedaan antara
bool
danBOOL
, memeriksa halaman web ini untuk penjelasan mengapa:http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
Karena
BOOL
merupakanunsigned char
bukan tipe primitif, variabel jenisBOOL
dapat berisi nilai-nilai selainYES
danNO
.Pertimbangkan kode ini:
Outputnya adalah:
Bagi kebanyakan orang ini adalah masalah yang tidak perlu, tetapi jika Anda benar-benar menginginkan boolean lebih baik menggunakan a
bool
. Saya harus menambahkan: iOS SDK biasanya digunakanBOOL
pada definisi antarmuka, sehingga merupakan argumen yang harus dipertahankanBOOL
.sumber
bool
, dan karenanya sudah menjadi tradisi untuk menggunakanint
atauchar
sebagai Boolean, kadang-kadang dengan #define untuk menyembunyikan perbedaan dan kadang tidak. Bahkan, saya tidak yakin apakah standar saat ini perlubool
diimplementasikan dengan cara yang mencegah memeriksa struktur internal itu.printf
berbohong. Nilaib
tidakYES
, itu "bukan nol", yang merupakan kondisi yang diuji. Jadi Anda harus memilikiprintf("b is not zero")
, yang belum tentu sama denganYES
. Dalam hal ini,b
keduanya "bukan nol" dan "bukan YA".Saya melakukan tes lengkap tentang ini. Hasil saya harus berbicara sendiri:
Outputnya adalah:
sumber
if
atauwhile
. Seperti ...while("guitar gently weeps")
seharusnya tidak bekerja ...if (user_id = ROOT_UID)
Anda mungkin ingin membaca jawaban untuk pertanyaan ini . Singkatnya, di Objective-C (dari definisi di objc.h):
sumber
Perbedaan utama (berbahaya!) Antara
true
danYES
dalam serialisasi JSON.Sebagai contoh, kami memiliki permintaan server tipe JSON dan perlu mengirim true / false di json sence:
Kemudian kami mengonversinya menjadi string JSON sebelum mengirim sebagai
Hasilnya adalah
Karena logika API
jsonString1
dapat mengakibatkan kesalahan.Jadi berhati-hatilah dengan booleans di Objective-C.
Singkatnya, hanya tepat
@YES
dan nilai dicor sebagai@((BOOL)expression)
yang dari__NSCFBoolean
jenis dan dikonversi ketrue
dengan JSON serialisasi. Ekspresi lain seperti@(expression1 && expression2)
( datar@(YES && YES)
) adalah__NSCFNumber (int)
tipe dan dikonversi ke1
dalam JSON.PS Anda cukup menggunakan boolean bernilai string
sumber
Ada bug halus yang tidak ada yang disebutkan di sini, yang saya pikir saya akan memasukkan ... lebih dari kesalahan logis daripada apa pun:
jadi masalahnya di sini hanya itu
(YES==1)
dan di C perbandingannya bukan boolean, tetapi berdasarkan nilai.karena
YES
itu hanya#define
(bukan sesuatu yang intrinsik bagi bahasa), itu harus bernilai, dan1
paling masuk akal.sumber
Saya pikir mereka menambahkan YA / TIDAK untuk lebih jelas dalam banyak kasus. Sebagai contoh:
terdengar lebih baik daripada
sumber
Pertama mari kita periksa apa yang benar dan salah dan apa yang memberi mereka arti di tempat pertama.
kita dapat membangun struktur yang disebut jika a maka b selain c dalam kalkulus lambda sebagai berikut:
Dalam JavaScript, Ini terlihat seperti ini:
agar ifThenElse bermanfaat, kita memerlukan fungsi "true" yang memilih kanan atau kiri, dan melakukan itu sambil mengabaikan opsi lain, atau fungsi "false" yang memilih opsi "true" tidak mengambil.
Kita dapat mendefinisikan fungsi-fungsi ini sebagai berikut:
dalam JavaScript terlihat seperti ini:
sekarang kita bisa melakukan hal berikut
dengan doThis dan doThat being (\ a. ()) karena lambda calculus tidak menawarkan layanan apa pun seperti pencetakan / matematika / string, yang bisa kita lakukan adalah tidak melakukan apa-apa dan mengatakan kita telah melakukannya (dan kemudian menipu dengan menggantinya dengan layanan di sistem kami yang memberikan efek samping yang kami inginkan)
jadi mari kita lihat ini dalam aksi.
Itu adalah lingkungan yang dalam yang dapat disederhanakan jika kita diizinkan menggunakan array / peta / argumen / atau lebih dari satu pernyataan untuk dipecah menjadi beberapa fungsi, tetapi saya ingin tetap murni seperti saya dapat membatasi diri pada fungsi tepat satu argumen hanya.
perhatikan bahwa nama Benar / Salah tidak memiliki signifikansi yang melekat, kita dapat dengan mudah mengubah nama mereka menjadi ya / tidak, kiri / kanan, kanan / kiri, nol / satu, apel / jeruk. Ini memiliki arti penting dalam pilihan apa pun yang dibuat, itu hanya disebabkan oleh jenis pemilih yang membuatnya. Jadi jika "KIRI" dicetak, kita tahu bahwa pemilih hanya bisa benar, dan berdasarkan pengetahuan ini kita dapat memandu keputusan kita selanjutnya.
Jadi untuk meringkas
sumber
Tidak, YA / TIDAK adalah cara yang berbeda untuk merujuk pada BENAR / SALAH (1/0)
sumber