std::cout<<"odd"
std::cout
döndürür ifadesidir:
fazla bilgi için aşağıdaki belgelere bakın neden std::cout << a << b << c
yapabilirsin). Boolean bağlamında değerlendirildiğinde, başarısızlık biti ayarlanmamışsa, yalnızca doğru döner. Böylece çıkış işlemi başarılı olursa, o zaman doğru olarak değerlendirilecektir.
if (remainder & 1) {
std::cout << "odd";
} else {
std::cout << "even";
}
Bu yararlanır:
Ancak, bu kodun amacı yerine, bu ifade etmek için bir akıllı (ve çok okunabilir olan) yöntemdir, bu değer test değildir &&
ve ||
operatörlerin kısa devre yapısı: a && b
olarak
- yanlıştır
a
ise o zaman(a
olarak değerlendirilirdeğerlendirilmez!) aksi takdirde b
olarak değerlendirir. a
doğruysa aksi takdirde b
olarak değerlendirir (b
değerlendirilmez!) a
olarak a || b
yılında
, o zaman değerlendirir. &&
sentezleme kısa devre, yanlış geri çünkü
Böylece remainder & 1
(bu durumda sıfır) yanlış değerlendirildiğinde daha sonra std::cout << "odd"
değerlendirilmez. Bu, b
(std::cout << "even"
) değerine neden olan dışsal ||
ifadesinin sol işlenenidir, çıktıya "çift" yazılır.
remainder & 1
öğesi true olarak değerlendirilirse (bu durumda sıfır olmayan), &&
için sağ işlenen "odd" değerini görüntüleyerek değerlendirilir. Bu işlemin başarılı olduğunu varsayarsak, ||
işleminin sol işleneni doğru olur, bu da kısa devreye neden olur ve doğru işleneni değerlendirmez.
Deneyimli programcılar oluyor burada tam olarak bilmek muhtemeldir, ancak bulduk olarak bu tekniğin en okunabilir değildir. Kodun amacı hakkında basit olmak daha iyidir (IMO), bu yüzden bir if
koşullu kullanıyorum - veya en azından üçlü operatörünü kullanıyorum: std::cout << (remainder & 1 ? "odd" : "even")
. Diğer dillerde (JavaScript akla gelir) (ab) kısa devre kullanan operatörleri kullanarak çok yaygın bir tekniktir. Genelde C++ 'da bu şekilde kullandıklarını görmüyorum ve böyle bir kullanımdan vazgeçerim.
Burada bulunan parantez'e ihtiyacınız yoktur, ancak operatörün önceliğine bağlı olarak (hatırlayamıyorum), 'geri kalan' ve 'alt bileşenini parantez içine almanız gerekebilir. –
Bkz. [C++ operatörü önceliği] (http://en.cppreference.com/w/cpp/language/operator_precedence) –