2015-10-15 10 views
50

Ich habe ein Widget in meiner GUI, das Diagramm (e) anzeigt. Wenn ich mehr als ein Diagramm habe, wird eine Legende in einem Rechteck auf der GUI angezeigt.Kann ich ein int mit einem boolean in C++ multiplizieren?

Ich habe eine QStringlist (legendText), die den Text der Legende enthält. Wenn keine Legende benötigt wird, wäre legendText leer. Wenn es eine Legende gibt, würde legendText den Text enthalten.

Für die Höhe des Rechtecks ​​um die Legende zu finden, würde Ich mag folgendes tun:

int height = 10; 
QStringList legendText; 
... 
height = height * (legendText->size() > 0); 
... 

Ist das eine gute Idee/guter Stil zu multiplizieren eine int mit einem boolean? Werde ich damit Probleme bekommen?

+2

Es scheint mir, dass diese Frage zu Stil und Lesbarkeit, während die Optimierung angebliche doppelten Bedenken. –

+5

Sie können, aber Sie verlieren die Lesbarkeit. Ich würde es vorziehen, meine Absicht explizit zu machen. –

+0

Es ist mir nicht klar, warum Sie "Höhe" an erster Stelle zuweisen, wenn Sie gerade dabei sind, es abzubrechen. Dies ist verwirrend und behindert auch die Korrektheit. Warum nicht nur 'int const height = 10 * (legendeText-> size()> 0);' oder 'int const height = legendeText-> isEmpty()? 0: 10; '(oder eine der anderen möglichen Variationen)? –

Antwort

107

Dies ist technisch in Ordnung, ich f ein bisschen unklar.

The bool wird zu einem int gefördert, so das Ergebnis ist gut definiert. Wenn ich mir diesen Code ansehe, bekomme ich nicht sofort die Semantik, die Sie erreichen wollen.

Ich würde einfach etwas schreiben wie:

height = legendText->isEmpty() ? 0 : height; 

Das macht Ihre Absicht viel klarer.

+8

Ich würde es weiter reduzieren, um nur 'if (legendText-> empty()) Höhe = 0;'. Das ist der übliche Weg dies zu schreiben. – MSalters

32

Es ist völlig in Ordnung, nach der Norm (§4.5/6):

A prvalue vom Typ bool kann auf einen prvalue vom Typ umgewandelt wird int, mit false immer Null und eine true werden.

Allerdings schlage ich isEmpty statt Vergleich size auf Null height = height * (!legendText->isEmpty());

Oder nutzen Sie den Bedingungsoperator als die anderen Antworten mit vorschlagen (aber immer noch mit isEmpty statt .size() > 0)

+0

Ich mag den zweigfreien Ansatz der Multiplikation mit '! LegendText-> isEmpty()'. –

+0

@RandallCook Für welche Maschine optimieren Sie speziell? Bedingte Bewegungsinstruktionen sind heutzutage ziemlich üblich, wodurch beide Optionen zweigfrei gemacht werden. – hvd

16

Sie die verwenden können, bedingter (ternärer) Operator:

height = (legendText->size() >0) ? height : 0 ; 
11

Vielleicht das?

if(legendText->isEmpty()) 
{ 
    height = 0; 
} 

oder

int height = legendText->isEmpty() ? 0 : 10; 
+4

Fügen Sie 'const' hinzu und Sie sind golden. –

0

Einige Leute nützlich (folgender Code folgende Informationen finden können, sollte in Hochleistungsprogrammen in Betracht gezogen werden, bei denen in jedem Taktzyklus Angelegenheiten und es ist hier Zweck alternative Techniken zu zeigen, ich würde nicht‘ t verwende es in dieser besonderen Situation).

Wenn Sie schnellen Code ohne Verzweigungen benötigen, können Sie die int-Multiplikation mit Boolean mit bitweisen Operatoren implementieren.

number = (-b & number); 

Wenn b ist true-b ist -1 dann und alle Bits auf 1:

bool b = true; 
int number = 10; 
number = b*number; 

kann optimiert werden. Ansonsten sind alle Bits 0.
Boolesche NOT (!b) kann durch XOR'ing b mit 1 (b^1) implementiert werden.
Also in Ihrem Fall, dass wir Ausdruck erhalten folgende:

height = (-(legendText->isEmpty()^1) & height); 
+1

Wenn Sie schnellen Code benötigen, können Sie Ihrem Compiler * mitteilen, Ihren Code * zu optimieren. Das machen Compiler. Ihr Code würde auf einem Nicht-2-Komplement-System fehlschlagen. –

+0

Compiler führen nur einfache Optimierungen durch. Sie werden die Arbeit nicht für dich erledigen. Sie müssten den Code verstehen und wir sind noch nicht da. – Maciej

+0

"Ihr Code würde auf einem Nicht-2-Komplement-System fehlschlagen". Solche Systeme sind sehr selten ... – Maciej

Verwandte Themen