2017-11-25 1 views
-1

Ich lernte C++ auf einem Mac, und vor kurzem auf Windows 7 übertragen. Ich habe die Windows v7.1 SDK heruntergeladen und das Installationsprogramm ausgeführt. Es ist die .net 4 abhängige Version des SDK, und ich habe .net 4 installiert.Compiler sagt logisch und ist undefined Bezeichner

Ich benutze die Kommandozeile, weil ich es bevorzuge, ich habe das mit dem GCC-Compiler auf dem Mac gemacht und ich bin ziemlich gut darin, wenn ich bedenke, dass ich ziemlich neu im Programmieren bin.

Ich habe die Entwicklerbefehlseingabe v7.1 sdk verwendet, weil sie die Umgebungsvariablen mithilfe der SetEnv-Batchdatei einrichtet.

Der Compiler ist offensichtlich der cl.exe-Compiler von Microsoft.

Ich lief das typische und sehr einfache Hello World-Programm, einschließlich einer getchar() am Ende, um mich das Programm tatsächlich sehen zu lassen, etwas Neues, da Mac dies nicht benötigt. Und der getchar funktionierte gut, das Programm kompiliert und lief gut.

Das Problem tauchte auf, als ich versuchte, einen Quellcode zu kompilieren, den ich auf dem Mac geschrieben hatte. Was übrigens auf dem Mac gut gelungen ist. Es fing an, einige wirklich seltsame Fehler hervorzurufen, wie zum Beispiel, dass der logische "und" Operator ein undefinierter Bezeichner ist. Nun könnte ich hier der Dumme sein, aber nach meinem Verständnis ist der Operator und ist kein Bezeichner, es ist ein Operator.

Also beschloss ich, das Problem einzugrenzen, indem ich ein sehr einfaches Programm schrieb, das eine if-Anweisung und eine else-Anweisung und den Operator 'and' verwendet und sieht, was passiert. Unten ist der Code Ich habe versucht zu kompilieren:

//hello, this is a test 

#include <iostream> 

int main() 

{ 

    char end; 
    int a = 0, b = 0; 

    std::cout << "If the variable a is larger than 10 and variable b is less than a, then b will be subtracted from a, else they are added.\n"; 
    std::cout << "Enter a number for variable a\n"; 
    std::cin >> a; 
    std::cout << "Now enter a number for variable b\n"; 
    std::cin >> b; 

    if (a>10 and b<a) a - b; 
    else a+b; 
    std::cout << "The value of a is: " <<a; 

    std::cout << "Press any key to exit"; 
    end = getchar(); 
    return 0; 
} 

Und das ist der Befehl, den ich das Programm, dass diese

cl /EHsc main.cpp 

Und last but not least, die Liste der Fehler zu kompilieren verwendet Programm ausgelöst, warum diese Fehler hier sind, bin ich mir nicht sicher. Es macht einfach keinen Sinn für mich.

main.cpp

error C2146: syntax error : missing ')' before identifier 'and' 

error C2065: 'and' : undeclared identifier 

error C2146: syntax error : missing ';' before identifier 'b' 

error C2059: syntax error : ')' 

error C2146: syntax error : missing ';' before identifier 'a' 

warning C4552: '<' : operator has no effect; expected operator with side-effect 

warning C4552: '-' : operator has no effect; expected operator with side-effect 

error C2181: illegal else without matching if 

warning C4552: '+' : operator has no effect; expected operator with side-effect 

Jeder einzelne dieser Fehler ist seltsam. Ich habe es vorher noch nie gesehen, und ich habe nie zuvor eine Frage gestellt, weil ich immer in der Lage gewesen bin, meine Antwort ohne zu fragen zu finden, aber auf dieser einen bin ich wirklich ratlos.

+2

'a + b' und' a-b' addieren und subtrahieren die beiden Variablen, aber nichts mit dem Ergebnis. Sie sind Anweisungen ohne Nebenwirkungen, wie das Speichern des Ergebnisses in einer Variablen oder das Übergeben an einen Funktionsaufruf, so dass sie den Programmablauf nicht beeinflussen. Tatsächlich wird Ihr Compiler sie wahrscheinlich vollständig aus dem Programm entfernen, da ihre Anwesenheit oder Abwesenheit das Programm überhaupt nicht beeinflusst. – Frxstrem

+2

Nimm das nicht in die falsche Richtung, aber du brauchst nicht so lange, um dein Problem zu erklären. Der Informations-Rausch-Verhältnis in Ihrem Beitrag ist nicht so toll. – StoryTeller

+0

Sie erkennen das und ist && in C++? Wenn dieser Code auf Mac kompiliert wurde, haben sie wirklich Compiler dort verdrahtet ... – anhoppe

Antwort

5

Dies ist ein Fehler (ein Feature) in Microsoft Visual C++ Compiler - es unterstützt keine Schlüsselwörter and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq. Sie sollten häufiger verwendete Operatoren wie && statt and, || statt or usw. Equivalence Tabelle verwenden:

+--------+-------+ 
| and | && | 
| and_eq | &= | 
| bitand | & | 
| bitor | | | 
| compl | ~ | 
| not | ! | 
| not_eq | != | 
| or  | || | 
| or_eq | |= | 
| xor |^ | 
| xor_eq | ^= | 
+--------+-------+ 

Im Gegensatz zu C++, C nicht jenen Schlüsselwort liefern, stattdessen stellt es einen Header <iso646.h> mit einem Satz von Makros mit diesen Namen, die zu diesen logischen Operatoren expandieren. Es wurde entwickelt, um Maschinen zu unterstützen, die in der Vergangenheit keine Zeichen auf einer Tastatur benötigten.

Da C++ versucht, Makros so weit wie möglich zu vermeiden, definiert C++ - Header <ciso646> keine Makros, stattdessen werden diese als integrierte Schlüsselwörter bereitgestellt.

Wie hier erwähnt, könnten neuere Versionen von MSVC einige Unterstützung dafür bieten, aber Sie sollten wissen, dass diese "alternativen Operatoren" selten verwendet werden. Ich rate Ihnen, bei der originalen C-Syntax zu bleiben.

+0

Haha, ich bin ein Dope. Ich dachte, mein Compiler hätte sich entschieden, ohne Grund herumzuwackeln. Ich hätte daran gedacht, die Standardmethode zur Definition von Operatoren zu versuchen. Ich habe auch einen Fehler in meinem Code gefunden, nachdem ich ihn gepostet habe. Ich habe nie den Wert von a aktualisiert, basierend auf den if und else Statements. Das erklärt den Fehler "Operator hat keine Auswirkung". Lustig ist, dass ich das noch nie zuvor in einem meiner Programme getan habe. Und ich habe gerade bemerkt, dass hier jemand auf diesen Fehler hingewiesen hat, ich kann nicht glauben, dass ich es verpasst habe und es hier aufgeschrieben habe. Naja, hält dich demütig richtig. – JoshD

+0

@JoshD Wenn eine Antwort Ihr Problem gelöst hat, sollten Sie es akzeptieren. – tambre

+0

Danke Mann, wie Sie sagen können Ich bin neu in Stack Overflow, ich habe versucht, einen Weg zu finden, um die Diskussion zu schließen oder als gelöst markieren. Und dann musste ich natürlich etwas anderes machen, was meine Aufmerksamkeit erforderte. Ich habe es herausgefunden. Wenn ich also jemals wieder eine Frage stellen muss, weiß ich, wie ich eine Antwort annehmen kann. – JoshD

1

Diese alternative operators sind im Header <iso646.h> als Makros in Visual C++ - Implementierung definiert. Sie sind mit anderen in die C++ Sprache integriert. Entweder um diesen Header:

#include <iso646.h> 

oder mit der /permisive- Compiler-Option kompilieren, wenn Sie die Visual C++ Compiler. Permissive compiler switch Sie müssen die obige Kopfzeile beim Kompilieren mit GCC nicht einschließen. Die GCC-Implementierung scheint den alternative operators representation Bezug zu respektieren, die besagt:

Die gleichen Worte in der Programmiersprache C in der <iso646.h> als Makros Datei enthält definiert sind.Da diese in C++ in die Sprache integriert sind, definiert die C++ - Version von <iso646.h> sowie <ciso646> nichts.

Live example on Coliru

+0

Sie sind auch definiert mit 'permissive-' Compiler-Schalter, der standardmäßig in zukünftigen Versionen von VS sein wird und, ehrlich gesagt, sollte zuerst für jedes neue Projekt eingeschaltet werden. –

+0

@Revolver_Ocelot Ich habe die Antwort gemäß Ihrer Eingabe aktualisiert. – Ron

+0

Sie sollten wirklich auf die C++ - Version von [der cppreference-Seite] (http://en.cppreference.com/w/cpp/language/operator_alternative) statt der C-Verknüpfung verweisen. – tambre

Verwandte Themen