Wenn ich den folgenden Code ausprobiert habe, bekomme ich den genannten Fehler.
if(a==1)
int b =10;
Aber das Folgende ist syntaktisch korrekt
if(a==1)
{
int b = 10;
}
Warum ist das?
Frau Pillai
Wenn ich den folgenden Code ausprobiert habe, bekomme ich den genannten Fehler.
if(a==1)
int b =10;
Aber das Folgende ist syntaktisch korrekt
if(a==1)
{
int b = 10;
}
Warum ist das?
schau
Das ist eigentlich eine ziemlich interessante Frage. Es ist nicht so einfach, wie es zunächst aussieht. Als Referenz werde ich dies auf der neuesten C11-Sprachgrammatik basieren, die in definiert ist N1570
Ich denke, der kontraintuitive Teil der Frage ist: Wenn das richtig ist C:
if (a == 1) {
int b = 10;
}
warum ist das dann nicht auch richtiges C?
if (a == 1)
int b = 10;
Ich meine, eine einzeilige Bedingung if
Aussage sollte entweder mit oder ohne geschweiften Klammern in Ordnung sein, oder?
Die Antwort liegt in der Grammatik des if
Anweisung, wie durch den C-Standard definiert. Die relevanten Teile der Grammatik habe ich unten zitiert. Kurz: Die int b = 10
Linie ist ein Erklärungkein Aussageund die Grammatik für die if
Anweisung erfordert eine Anweisung nach der Bedingung, dass es sich um einen Test handelt. Aber wenn Sie die Deklaration in geschweiften Klammern einschließen, wird sie zu einer Aussage und alles ist gut.
Und nur um die Frage vollständig zu beantworten – das hat nichts mit dem Umfang zu tun. Das b
Variable, die innerhalb dieses Gültigkeitsbereichs existiert, ist von außerhalb nicht zugänglich, aber das Programm ist immer noch syntaktisch korrekt. Genau genommen sollte der Compiler keinen Fehler darauf werfen. Natürlich sollte man mit bauen -Wall -Werror
Sowieso 😉
(6.7) declaration: declaration-specifiers init-declarator-listopt ; static_assert-declaration (6.7) init-declarator-list: init-declarator init-declarator-list , init-declarator (6.7) init-declarator: declarator declarator = initializer (6.8) statement: labeled-statement compound-statement expression-statement selection-statement iteration-statement jump-statement (6.8.2) compound-statement: { block-item-listopt } (6.8.4) selection-statement: if ( expression ) statement if ( expression ) statement else statement switch ( expression ) statement
Außerdem gibt es einige Unterschiede zwischen C und C++, die am besten gelöst werden, indem Sie direkt zur Dokumentation gehen. Überprüfen Sie meine Antwort bzgl while
Schleife, in der ich mit demselben Kompilierungsfehler gerungen habe.
– Lebensbalance
10. Mai 2015 um 18:28 Uhr
Die Fehler aus dieser Antwort und Ihrer sind nicht genau gleichwertig. Diese Antwort befasst sich mit dem Hauptteil der Ablaufsteuerungsanweisung (der Aussage Teil von if ( expression ) statement
), während Ihre sich mit der Kontrolle befasst Ausdruck. Bei dieser Antwort sind die C- und C++-Grammatik identisch.
– schau
13. Mai 2015 um 19:07 Uhr
{ }
–>
definiert Umfang, also if(a==1) { int b = 10; }
sagt, Sie definieren int b für {}- diesen Bereich. Zum
if(a==1)
int b =10;
es gibt keinen Spielraum. Und Sie werden nicht in der Lage sein, zu verwenden b
irgendwo.
Danke, jetzt habe ich es.
– MsPillai
15. März 2014 um 5:18 Uhr
@MsPillai Willkommen. Wenn die Frage also gelöst ist, können Sie die Antwort akzeptieren.
– Pranit Kothari
15. März 2014 um 5:33 Uhr
Es scheint nicht um den Umfang zu gehen. Bitte überprüfen Sie die Antwort von @sheu .
– MsPillai
15. März 2014 um 9:01 Uhr
Bei C89 kann eine Variable nur am Anfang eines Blocks definiert werden.
if (a == 1)
int b = 10; // it's just a statement, syntacitially error
if (a == 1)
{ // refer to the beginning of a local block
int b = 10; // at the top of the local block, syntacitially correct
} // refer to the end of a local block
if (a == 1)
{
func();
int b = 10; // not at the top of the local block, syntacitially error, I guess
}
Ein Block definiert einen Lebensbereich der Variablen, in denen.
– Benutzer3422531
15. März 2014 um 7:35 Uhr
“es ist nur eine Aussage” – eigentlich ist es eine Erklärung. Eine Aussage wäre dort legal. Das if
muss eine Anweisung folgen, jedoch zählt eine in geschweifte Klammern eingeschlossene Liste von Deklarationen und Anweisungen als Anweisung.
– MM
15. März 2014 um 8:31 Uhr
Poste deinen Fehler. Ihr Code ist einsatzbereit, es sei denn, Sie greifen auf “b” außerhalb des Bereichs zu.
– Abhineet
15. März 2014 um 5:13 Uhr
Ich habe den Fehler in der Überschrift erwähnt. Auch wenn b an keiner anderen Stelle im Code verwendet wird, tritt der Fehler weiterhin auf.
– MsPillai
15. März 2014 um 5:17 Uhr
Außerdem gibt es einige Unterschiede zwischen C und C++, die am besten gelöst werden, indem Sie direkt zur Dokumentation gehen. Überprüfen Sie meine Antwort bzgl
while
Schleife, in der ich mit demselben Kompilierungsfehler gerungen habe.– Lebensbalance
10. Mai 2015 um 18:27 Uhr