den Standard als der N4567 verbietet einige Arten von Wieder Erklärung eines Namens in einem Zustand zuvor erklärt wie folgt-nach der Norm (§3.3.3/4):Was bedeutet der Standard durch "eine nachfolgende Bedingung dieser Aussage"?
Namen in der deklarierten for-init-Anweisung, die for-range-Deklaration und in der Bedingung von if-, while-, for- und switch-Anweisungen sind lokal für die if-, while-, for- oder switch-Anweisung (einschließlich der kontrollierten Anweisung) und dürfen nicht in einer nachfolgenden Bedingung dieser Anweisung noch im äußersten Block (oder, für die if-Anweisung, irgendeiner der äußersten Blöcke) der kontrollierten Aussage redeclariert werden; siehe 6.4.
jedoch in Anbetracht der Tatsache, dass der folgende Code kompiliert fein,
int main(void) {
if (int i=10)
if (int i=20)
;
return 0;
}
es scheint mir unklar, was genau „eine nachfolgende Bedingung dieser Aussage“ steht.
Vielleicht bezieht es sich auf die Situation für 'for':' für (int i = 0; int i = 1;); '. Es gibt eine nachfolgende Bedingung nach der ursprünglichen Erklärung von "i". Die Formulierung für "wenn", "irgendeinen der äußersten Blöcke", zeigt an, dass es die else-Zweige eines "if" als Teil dieses "if" betrachtet, also denke ich, dass es sich auch auf "if (int i = 1); sonst wenn (int i = 1); –
Ich denke, es geht darum, einen Namen zweimal unter denselben Bedingungen zu deklarieren. Das sind zwei verschiedene 'if'-Aussagen mit unterschiedlichen Bedingungen. – Cornstalks
Ah, die Struktur ist 'if (...) stmt; sonst stmt', also glaube ich nicht, dass mein Beispiel mit den beiden Wenns übereinstimmt. "Jeder der äußersten Blöcke" soll sich eindeutig auf "if (int i = 1) {int i = 2; } else {int i = 3; } 'und nicht zu 'if (int i = 1); sonst wenn (...) {int i = 2; } '(IMO). –