Frage

[Diese Frage bezieht sich aber nicht das gleiche wie dieses .]

Wenn ich versuche, Werte bestimmter Arten als Boolesche Ausdrücke zu verwenden, erhalte ich eine Warnung. Anstatt die Warnung unterdrücken, benutze ich manchmal den ternären Operator (?:) zu einem bool zu konvertieren. Die Verwendung von zwei nicht-Operatoren (!!) scheint das gleiche zu tun.

Hier ist, was ich meine:

typedef long T;       // similar warning with void * or double
T t = 0;
bool b = t;           // performance warning: forcing 'long' value to 'bool'
b = t ? true : false; // ok
b = !!t;              // any different?

So funktioniert die Doppel nicht Technik wirklich das gleiche tun? Ist es ein mehr oder weniger sicher als die ternäre Technik? Diese Technik ist ebenso sicher mit nicht-ganzzahligen Typen (beispielsweise mit void * oder double für T)?

Ich frage nicht, ob !!t guter Stil ist. Ich frage, ob es semantisch anders als t ? true : false ist.

War es hilfreich?

Lösung

Das Argument der! Betreiber und das erste Argument des ternären Operator sowohl implizit in bool umgewandelt, so !! und: sind IMO albern redundante Dekorationen des Darstellers. Ich stimme für

b = (t != 0);

Keine impliziten Konvertierungen.

Andere Tipps

Alternativ können Sie dies tun: bool b = (t != 0)

Achtung!

  • Ein boolean ist über Wahrheit und Falschheit.
  • Eine ganze Zahl ist über ganze Zahlen.

Das sind sehr unterschiedliche Konzepte:

  • Wahrheit und Falschheit ist über Dinge zu entscheiden.
  • Die Zahlen sind über solche Sachen zu zählen.

Wenn diese Konzepte überbrücken, sollte es explizit erfolgen. Ich mag Dima-Version am besten können:

b = (t != 0);

Dieser Code eindeutig sagt: zwei Zahlen vergleichen und den Wahrheitswert in einem boolean speichern

.

Alle gültigen Techniken, die alle den gleichen Code erzeugen.

Ich persönlich deaktivieren nur die Warnung, damit ich die sauberste Syntax. Casting auf einen Bool ist nicht etwas, was ich mache mir Sorgen um versehentlich zu tun.


Ja, es ist sicher.


0 als falsch interpretiert wird, ist alles andere wahr,
damit! 5 kommt als falsch
0 kommt als wahr
so !! 5 als wahr heraus

Ich würde nicht verwendet werden:

bool b = !!t;

Das ist die Mindeste lesbare Weise (und damit die am schwersten zu halten)

Die anderen sind abhängig von der Situation.
Wenn Sie konvertieren nur in einem Bool Ausdruck verwenden.

bool b = t ? true : false;
if (b)
{
    doSomething();
}

Dann würde ich lassen Sie die Sprache es für Sie tun:

if (t)
{
    doSomething();
}

Wenn Sie tatsächlich einen Booleschen Wert sind zu speichern. Dann erst würde ich fragen, warum Sie eine lange in den ersten Plätzen, die die Besetzung erfordert. Unter der Annahme, müssen Sie die lange und der Boolesche Wert würde ich alle folgenden abhängig von der Situation in Betracht ziehen.

bool  b = t ? true : false;      // Short and too the point.
                                 // But not everybody groks this especially beginners.
bool  b = (t != 0);              // Gives the exact meaning of what you want to do.
bool  b = static_cast<bool>(t);  // Implies that t has no semantic meaning
                                 // except as a bool in this context.

Zusammenfassung: Verwenden Sie, was für den Kontext der meisten Bedeutung liefert Ihnen sind in.
Versuchen Sie, und machen es auf der Hand, was Sie tun

Ich empfehle Unterdrückung der nie diese Warnung, und nie eine c cast (Bool) unter Verwendung es zu unterdrücken. Die Umwandlungen können nicht immer genannt werden, wie Sie annehmen.

Es gibt einen Unterschied zwischen einem Ausdruck, der auf true und einen boolean dieses Wertes auswertet.

Sowohl !! und ternäre nehmen gewöhnungsbedürftig, aber wird die Arbeit in ähnlicher Weise tun, wenn Sie nicht über interne Typen mit überladenen Abgüsse definieren wollen in bool.

Dima Ansatz ist auch in Ordnung, da sie den Wert eines Ausdrucks zu einem bool zuweist.

Wenn Sie über die Warnung besorgt sind, können Sie auch die Besetzung erzwingen: bool b = (bool)t;

Ich hasse !! t wirklich !!!!!!. Es riecht nach das Schlimmste, was über C und C ++, die Versuchung zur Hälfte mit Syntax zu klug sein.

bool b (t = 0!); // Ist der beste Weg, meiner Meinung nach, es zeigt explizit, was geschieht.

!! kann kompakt sein, aber ich denke, es ist unnötig kompliziert. Besser die Warnung oder verwenden Sie den ternären Operator zu deaktivieren, meiner Meinung nach.

würde ich b = (0 = t) verwenden - zumindest jeder vernünftige Mensch es leicht lesen kann. Wenn ich doppelt dingt im Code sehen würde, würde ich ziemlich überrascht sein.

Deaktivieren Sie die Warnung.

Schreiben für Klarheit zuerst; dann das Profil; optimiert dann für Geschwindigkeit, wo erforderlich.

!! nur dann sinnvoll ist, wenn Sie einen Booleschen Ausdruck in der Arithmetik Art und Weise verwenden, z.

c = 3 + !!extra; //3 or 4

(dessen Stil ist eine andere Diskussion.) Wenn alles, was Sie brauchen, ist ein boolescher Ausdruck ist, das !! ist redundant. Schreiben

bool b = !!extra;

macht so viel Sinn wie:

if (!!extra) { ... }

Vergleich zu 0 nicht so gut funktionieren. Welche kommt zurück - warum !! vs. ternäre?

class foo { public: explicit operator bool () ; };

foo f;

auto a = f != 0; // invalid operands to binary expression ('foo' and 'int')
auto b = f ? true : false; // ok
auto c = !!f; // ok

Ich empfehle die Verwendung

if (x! = 0)

oder

if (x! = NULL)

statt, wenn (x); es ist besser verständlich und lesbar.

Das Doppel nicht fühlt sich komisch zu mir und im Debug-Code wird sehr anders sein als in optimierten Code.

Wenn Sie in der Liebe mit sind !! Sie konnte immer Makro es.

#define LONGTOBOOL(x) (!!(x))

(Nebenbei bemerkt, der ternäre Operator ist, was ich in diesen Fällen begünstigen)

würde ich bool b = t verwenden und die Kompilierung verlassen warnen, Kommentar zu dieser Sicherheit der bestimmten Linie. die Warnung deaktivieren beißen Sie in einem anderen Teil des Codes in den Hintern kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top