Stroustrup örneğinde, kolon “dönüş 1: 2” ne anlama geliyor?


163

Bir kolonun belirli bir kullanımını anlamıyorum.

Bjarne Stroustrup'un C ++ Programlama Dili kitabında buldum , 4. baskı, bölüm 11.4.4 "Arama ve Geri Dönüş", sayfa 297:

void g(double y)
{
  [&]{ f(y); }                                               // return type is void
  auto z1 = [=](int x){ return x+y; }                        // return type is double
  auto z2 = [=,y]{ if (y) return 1; else return 2; }         // error: body too complicated
                                                             // for return type deduction
  auto z3 =[y]() { return 1 : 2; }                           // return type is int
  auto z4 = [=,y]()−>int { if (y) return 1; else return 2; } // OK: explicit return type
}

Kafa karıştırıcı kolon, açıklamada 7. satırda görünür return 1 : 2. Ne olabileceğine dair hiçbir fikrim yok. Bir etiket ya da üçlü operatör değil.

İlk üyesi olmayan (ve) olmayan bir koşullu üçlü operatör gibi görünüyor ?, ancak bu durumda bir koşul olmadan nasıl çalışabileceğini anlamıyorum.


6
Sonunda derleme hatası (gcc ve clang). Ayrıca tüm bu satırlar noktalı virgül gerektirir, ancak yine de bir hata vardır.
Cruz Jean

216
Moderatör Notu: Oyunuzu kapatmadan önce lütfen bunu "yazım hatası" sorusu olarak düşünün. Evet, sorun bir yazım hatası, ama askerin yaptığı bir yazım hatası değil. Aksine, yayınlanmış bir kitapta bulunur. Bu, bu sorunun ve cevaplarının gelecekte başkaları için yararlı olabileceği anlamına gelir, bu da bir yazım hatası olarak kapatmak için güçlü bir karşı göstergedir. (GÜNCELLEME: Bu konu şu anda Meta'da tartışılıyor ; lütfen orada tartmaktan çekinmeyin.)
Cody Gray

3
Belki de en iyi cevap şu olacaktır: Kodu derlemeye çalışın; eğer derlenmezse, bu bir yazım hatası olduğuna dair iyi bir işarettir.
jrw32982 Monica

Bir derleyicide derleyemeyen (hatta dahili bir derleyici hatasına neden olan), ancak farklı bir
J. Antonio Perez

1
@John MSVC ile bazı katlama ifadeleri denedim ve derlemediler. Öyleyse okuduğum tüm bölüm bir yazım hatası mı olmalı? ;) C ++ derleyicileri her zaman geçerli C ++ kodunu derleyemez, saçma bir şekilde karmaşık olan dilden gelir.
Voo

Yanıtlar:


205

Kitaptaki bir yazım hatası. C ++ Programlama Dili'nin 2. ve 3. baskıları için Errata'ya bakın . Örnek aşağıdaki gibi olmalıdır:

auto z3 =[y]() { return (y) ? 1 : 2; }

11
Neden (y)ve sadece y?
Küçük Yardımcı

7
@LittleHelper Belki de en iyi uygulama ya da bir şey, hep böyle yazılmış görüyorum. Belki daha karmaşık karşılaştırmalar ile karışıklığı önlemek için ...
Redwolf Programları

28
Şahsen, genellikle (cond) ? a : bnetlik için kullanıyorum - örneğin kod yoluyla kayma yaparken foo = x > y ? a : bolduğu gibi yanlış ifadelerden kaçınmama yardımcı oluyor foo = x ....
user1686

8
@LittleHelper Gerçekten gerekli değil. Bununla birlikte, işlev benzeri bir makroda parantezlerin kullanıldığı argümanların etrafına yerleştirilmesi en iyi uygulamadır, aksi takdirde argümanların genişletilmesi beklenmedik davranışlar verebilir. "Foo (2 + 3)" ile çağırdığınız "foo (x) x * 2" değerini iki katına çıkarmak için işlev benzeri bir makro düşünün. Sonuç 2+ (3 * 2) olacaktır çünkü argüman olduğu gibi genişletilir ve öncelik kuralları devralınır. Makronuz "foo (x) (x) * 2" ise, doğru bir şekilde (2 + 3) * 2 elde edersiniz. Stroustrup'un bu stili her yerde kodlama güvenliği için kullanma alışkanlığı olabilir.
Graham

2
@Graham Çok düşük ihtimal. Stroustrup aslında fonksiyon makroları yazmaz (C ++ satır içi fonksiyonlar daha iyidir). Üçlü operatörün biraz karmaşık öncelik kurallarına sahip olması daha olasıdır, bu nedenle parens ile önceliği alışkanlıkla açıklığa kavuşturmak iyidir.
Martin Bonner Monica'yı

19

Bana basit bir yazım hatası gibi görünüyor. Muhtemelen şöyle olmalıdır:

auto z3 =[y]() { return y ? 1 : 2; }

Lambda herhangi bir parametre almadığından, parenler isteğe bağlıdır. İsterseniz bunu kullanabilirsiniz:

auto z3 =[y] { return y ? 1 : 2; }

11

return 1 : 2; bir sözdizimi hatasıdır, geçerli bir kod değildir.

Doğru bir ifade daha çok benzer olurdu return (y) ? 1 : 2;.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.