: C/C++'da bir op-op nasıl yürütülür? Aşağıdakiler için
(a != b) ? cout<<"not equal" : cout<<"equal";
ben no-op ile
cout<<"equal"
ikame edilmesi suretiyle yukarıdaki deyimi kullanabilirsiniz nasıl eşit olması umurumda değil herhalde.
: C/C++'da bir op-op nasıl yürütülür? Aşağıdakiler için
(a != b) ? cout<<"not equal" : cout<<"equal";
ben no-op ile
cout<<"equal"
ikame edilmesi suretiyle yukarıdaki deyimi kullanabilirsiniz nasıl eşit olması umurumda değil herhalde.
, en iyi seçenek eğer bir için değiştirmek şeklinde olur.
bir ifade olarak kullanılması halinde çalışmaz. "if", C.'de bir ifade değil. –
Yani? Bu fikir, ilk etapta bu tür çirkin ifadelerden kaçınmaktan kesinlikle uzaktır. –
Bu çok kafa karıştırıcı koddur. Sen sadece
cond ? cout << "equal" : cout;
yazabilirim ama vermeyeceksin (olur mu?) Bunun için if
konvansiyonel var çünkü. o kokacak
if (a!=b) cout << "not equal";
çok daha az: gerçekten ikinci bir eylem gerekmez bir üçlü operatör için ise
if (a!=b) cout<<"not equal";
Basit: Ben üçlü operatör aynı tipte iki sonuçlarını gerektirir
if (a != b)
cout << "not equal";
olarak kod olacaktır. Yani aynı zamanda akışı operatörü (< <) sadece ostream referansını döndürdüğü için
(a != b) ? cout << "not equal" : cout;
ile kurtulmak mümkün olabilir. Yine de bence bu çirkin ve gereksiz.
Burada sorun şu ki operatörün: argüman olarak iki İfadesi vardır. Diyelim ki .. a = x? y: z;
Tanım gereği tanım bir değere sahip olmalıdır ... bu yüzden "atlayamazsınız".
Diğer cevaplardan eksik olan tek şey şudur: C/C++ 'da "noop" kodlamak için doğrudan bir yol yoktur.
Ayrıca: (a != b) ? : printf("equal\n");
, aslında benim için derleme yapar (gcc -ansi in gcc 4.2.4).
Bu tamamen doğru değil. Boş bir blok “no-op” olarak davranabilir. Ancak, bu bir * ifade değildir *. Bir ifadenin C++ ile yazılması gerektiğinden, “no-value” olarak evrensel olarak kabul edilebilir bir değişmez/sabit yoktur. “No-op” burada gerçekten doğru kelime değil. –
gcc orta vadeli dışarıda bırakarak sağlayan bir uzantısı vardır, ama yasal C veya C++ değil. – bames53
Sözdizimi yalnızca bir ifade gerektirir. Sadece gidebilirsiniz: (a! = B)? Cout < < "eşit değil": 1;
Bu ifadenin sonuç türü nedir? Int veya Akış? – BCS
çalışmaz: Standart: (C E1: E2): E1 veya E2 bir olgu, sınıfsal olmayan türü varsa, E1 E1 örtük ifade E2 eğer olurdu türüne dönüştürülebilir eğer E2 maç dönüştürülebilir aşağıdaki E2). bir rvalue (veya E2 bir rvalue ise o vardır, tip) ilginç hack var –
şu ancak çalıştığını neden kodunuzu okuyan insanlara açık olmayabilir, aradığınız şeyi başarmış olacağım:
(a != b) && (cout << "equal");
Şahsen, Vinko Vrsalovic dan this yanıta katılabilir .
dönüştürülmüştür fakat okunabilirliği nedenlerle bunu kullanmamayı tavsiye ederim. Ayrıca, derleyici optimalleştirmeye güvenmemelisiniz. – ya23
ya23 @, onun üzerine dayanır neyi optimizasyonu konusunda daha kesin olabilir? Bu ifade tüm optimizasyon bağlamlarında iyi tanımlanmıştır. –
kod odak çıkış işlemi değil, koşul ise, bu gibi sonra bir şey yapılabilir:
cout << (cond ? "not equal" : "");
sen hiçbir şey yapmak istiyorum çünkü o da, böyle değil şüpheli "else" cümlesi.
Her iki ifadeleri derlemek:
(a != b) ? cout<<"not equal" : NULL;
(a != b) ? NULL : cout<<"equal";
C++ 11 yazabilir (boşluk durumunda) in:
somecondition ? foo() : [] {}() ;
Yani NOP aslında boş bir lambda olduğunu. Ayrıca, herhangi bir türü ve değeri döndürebilirsiniz.
Bu
kendisi tarafından overkill tüm biraz bak ama varsayalım olabilir bu vardır: Biri somecondition4 ekler, ancak unutuyor elleçleme kodu dahil etmek eğersomecondition1 ? foo1() :
somecondition2 ? foo2() :
somecondition3 ? foo3() :
flip_out_because_unhandled_condition() ;
Şimdi, yazılım flip_out_ arayacak .. Her türlü istenmeyen etkiye sebep olan işlev. Ama belki somecondition4 özel ilgiye gereksinim yoktur, sadece göz ardı edilmesi gerekmektedir. Peki o zaman yazabilirsiniz: noop
somecondition1 ? foo1() :
somecondition2 ? foo2() :
somecondition3 ? foo3() :
somecondition4 ? []{}() :
flip_out_because_unhandled_condition() ;
(void)0;
olduğunu. expr?false:true
formunu kullanmanın birçok nedeni vardır. Assert() nasıl uygulandığını görün. sizin örnekte Yani
(a != b) ? (void)0 : cout<<"equal";
ait
olası yinelenen [I C++ no-op makro (veya şablon) uygulamak nasıl?] (http://stackoverflow.com/questions/1306611/how-do -i-uygulamak-no-op-makro veya şablon-in-c) – user