2008-11-18 14 views
5

: 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.

+0

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

cevap

20

, en iyi seçenek eğer bir için değiştirmek şeklinde olur.

+0

bir ifade olarak kullanılması halinde çalışmaz. "if", C.'de bir ifade değil. –

+1

Yani? Bu fikir, ilk etapta bu tür çirkin ifadelerden kaçınmaktan kesinlikle uzaktır. –

1

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

0
if (a!=b) cout<<"not equal"; 
11

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.

1

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".

4

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).

+0

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. –

+1

gcc orta vadeli dışarıda bırakarak sağlayan bir uzantısı vardır, ama yasal C veya C++ değil. – bames53

0

Sözdizimi yalnızca bir ifade gerektirir. Sadece gidebilirsiniz: (a! = B)? Cout < < "eşit değil": 1;

+0

Bu ifadenin sonuç türü nedir? Int veya Akış? – BCS

+0

ç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 –

4

ş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 .

+0

dönüştürülmüştür fakat okunabilirliği nedenlerle bunu kullanmamayı tavsiye ederim. Ayrıca, derleyici optimalleştirmeye güvenmemelisiniz. – ya23

+3

ya23 @, onun üzerine dayanır neyi optimizasyonu konusunda daha kesin olabilir? Bu ifade tüm optimizasyon bağlamlarında iyi tanımlanmıştır. –

1

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.

0

Her iki ifadeleri derlemek:

(a != b) ? cout<<"not equal" : NULL; 

(a != b) ? NULL : cout<<"equal"; 
1

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ğer

somecondition1 ? 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() ; 
3

(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

, kullanmak (a != b) ? (void)0 : cout<<"equal";

ait
İlgili konular