Was bedeutet eine Aussage "wahr" oder "10;" in C ++ und wie kann sie verwendet werden?

8

In C ++ kann man eine der folgenden Aussagen schreiben:

%Vor%

oder etwas wie

%Vor%

Letzteres kann verwendet werden, um eine Compiler-Warnung "Eine Variable wird initialisiert, aber nicht referenziert" (C4189 in VC ++) zu unterdrücken, wenn ein Makro, das in einer Konfiguration in eine leere Zeichenfolge expandiert wird, später mit der result -Variable verwendet wird. So:

%Vor%

Was bedeuten solche Aussagen? Wie können sie verwendet werden, außer für Compiler Warning Suppression?

    
sharptooth 09.07.2009, 08:21
quelle

9 Antworten

7

Diese Anweisungen (Ausdrucksanweisungen in der C ++ - Grammatik genannt) sind gültig, weil sie Ausdrücke sind.

Ausdrücke sind alle Konstrukte, die eine Art von Wert berechnen, z. B.

  • 3 + 5
  • einigeVariable
  • someFunctionCall (2)
  • someVar + = 62
  • val & gt; 53

Ich denke, um die Grammatik einfach zu halten, haben sie sich entschieden, nicht zwischen jenen Ausdrücken zu unterscheiden, die tatsächlich einen Nebeneffekt haben (wie der Funktionsaufruf oder die Zuweisung) und denen, die das nicht tun.

    
Timbo 09.07.2009, 08:32
quelle
26

Diese Art von Aussagen ist eine logische Erweiterung dessen, wie andere Teile der Sprache funktionieren. Betrachten Sie eine Funktion, die einen Wert zurückgibt, zum Beispiel int foo() , der auch einige Nebenwirkungen hat. Manchmal möchten Sie nur, dass diese Nebenwirkungen auftreten, also schreiben Sie foo(); als Anweisung.

Nun, während dies nicht genau wie 10; aussieht, wird der Funktionsaufruf früher oder später zu einem int ausgewertet, und nichts passiert mit diesem int, genau wie mit 10; .

Ein weiteres Beispiel für dasselbe Problem ist, dass a = b = 10; verwendet werden kann, dh b = 10 muss auf 10 ausgewertet werden. Daher können Sie keine Zuweisung durchführen, ohne einen Wert zu erzeugen, der unterdrückt werden muss.

Solche Werte als Anweisungen schreiben zu können, ist nur ein logischer Weg, um die Sprache zu erstellen, aber für die Fälle, die Sie präsentieren, kann es sogar eine gute Idee sein, eine Compilerwarnung dafür zu geben.

Es sei denn, Sie verwenden es, um Compiler-Warnungen zu unterdrücken;)

    
Magnus Hoff 09.07.2009 08:30
quelle
3

Eine solche Anweisung tut nichts und wird wahrscheinlich von jedem vernünftigen Compiler optimiert.

Es kann nützlich sein, die Warnung unbenutzte Variable loszuwerden, aber bei einigen Compilern können Sie statt dessen eine Anweisung erhalten, die keine Auswirkung hat .

    
Paolo Capriotti 09.07.2009 08:31
quelle
1

Sie haben keinen praktischen Nutzen jenseits der Unterdrückung von Compiler-Warnungen, und im Allgemeinen wird der Compiler eine solche Konstanten-Wert-Anweisung, die keine Nebenwirkung hat, herausnehmen.

    
Crashworks 09.07.2009 08:28
quelle
0

Sie sind Ausdrücke, die ausgewertet werden, vorausgesetzt, der Compiler optimiert sie nicht. Was "Bedeutung" angeht, ich bin mir nicht sicher, was du damit meinst!

    
anon 09.07.2009 08:28
quelle
0

In C und C ++ wird eine Anweisung ausgewertet, die nur ein Ausdruck ist.

Die Tatsache, dass der Ausdruck möglicherweise nutzlos ist, ist harmlos und führt bei aktiviertem Optimierer dazu, dass überhaupt kein Code generiert wird. Wie Sie jedoch festgestellt haben, zählt es normalerweise als Verwendung einer Variablen.

Beachten Sie, dass Anweisungen, die nur einen Ausdruck enthalten, ziemlich häufig sind. Ein einfacher Funktionsaufruf ist beispielsweise eins. In printf("hello, world.\n"); wird der Rückgabewert von printf() ignoriert, aber die Funktion wird noch aufgerufen und ihr beabsichtigter Effekt (Textausgabe) passiert.

Außerdem ist eine Variablenzuweisung x = 3; auch eine Anweisung, die aus einem einfachen Ausdruck besteht, da die Zuweisung ein Operator ist und zusätzlich zu seinem Nebeneffekt der Änderung des lvalue einen Wert zurückgibt.

    
RBerteig 09.07.2009 08:32
quelle
0

Obwohl legal, halte ich diese Aussagen für unübersichtlich und sollte vermieden werden, auch wenn Warnungen unterdrückt werden. Für mich ist es vernünftiger, die Warnung mit etwas wie diesem zu unterdrücken:

%Vor%     
kgiannakakis 09.07.2009 08:26
quelle
0

In einigen eingebetteten Umgebungen hat das Zugreifen auf ein Nur-Lese-Register Nebenwirkungen, z.B. lösche es.

Schreiben int temp = IV; Um es zu löschen, wird eine Warnung ausgegeben, weil temp nicht verwendet wird. In diesem Fall schreibe ich IV;

    
James 09.07.2009 11:10
quelle
0

Ich stimme Magnus 'Antwort zu. Es gibt jedoch eine Sache, die mich verwirrt: Warum benutzt du diesen Unsinn?

%Vor%

um Compilerwarnungen los zu werden? Meiner bescheidenen Meinung nach ist es viel schlimmer, in einer solchen Situation keine Warnung zu haben. Die Variable result wird immer noch nicht verwendet - Sie haben gerade "den Dreck unter den Teppich gekehrt". Dieser "lone variable" -Ansatz sieht so aus, als ob etwas fehlt ( Habe ich versehentlich etwas gelöscht? ). Warum benutzt du nicht

? %Vor%

an erster Stelle? Es versichert jedem, der Ihren Code lesen würde, dass Ihnen das Ergebnis nicht wichtig ist. Es ist sehr schwierig, dies "versehentlich" zu stellen. Offensichtlich erzeugt dies keine Compiler-Warnungen.

    
Howdy 09.07.2009 12:00
quelle

Tags und Links