Fehler, Irrtümer, Fragen - Seite 2889

 
A100:

Sie haben eine Zufallszahl 0, ich habe 540016640

aber es sind immer noch Zufallszahlen.

Ich dachte, das MQ wurde gestrichen.

 
Roman:

Ich dachte, die MQ wurde gestrichen.

Bei globalen Variablen scheinen sie mit Null initialisiert zu werden, aber im Körper von Funktionen bin ich beim ersten Durchlauf auf unterschiedliche Initialisierungen gestoßen. Ich versuche, vor der Verwendung immer zu initialisieren. Ich stimme zwar zu, aber das Verhalten muss eindeutig sein.

Und eine weitere Deklaration im Schleifenkörper, in Klammern, macht die Variable lokal für die Schleife. Es steht nur nicht in den Unterlagen.

 
Roman:

Außerdem gibt der Compiler keine Warnung aus, dass die Variable nicht initialisiert ist.

Print(...) warnt Sie möglicherweise nicht, wenn der Parameter durch eine nicht konstante Referenz übergeben wurde

int f( int& i ) { return i; }
void OnStart()
{
        int i;  
        f( i ); //нормально
}
 
A100:

Wenn die Schleifen gleich sind, dann sollte auch das Verhalten des Compilers gleich sein, aber es ist anders. Genau hier liegt der Fehler. Sie haben erklärt, warum es im Fall (1) eine Warnung gibt, erklären Sie dann, warum es im Fall (2) keine gibt? Was hat sich im Prinzip geändert? Und wenn eine nicht initialisierte Variable verwendet wird, warum ist dann das Endergebnis richtig, wenn der Code ausgeführt wird?

Es gibt eine solche Wissenschaft - die Logik. Wenn A und B gleich sind und A rot ist, muss B auch rot sein, nicht grün

Ich habe kein Programmierstudium absolviert, ich kann nur logisch spekulieren, so wie Wassili Iwanowitsch und Petka über Logik spekuliert haben.

Im ersten Fall wird die gesamte Zeichenkette ausgeführt

for ( int i = 0, j; i < 10; i = j )

und hier wird die Variable j nicht initialisiert, sondern ihr Wert wird der Variablen i zugewiesen

Im zweiten Fall wird, obwohl die Variable j nicht initialisiert ist, in der nächsten Zeile, in der sie verwendet wird, nicht ihr Wert zugewiesen, sondern ihr Wert ist es. Mit anderen Worten: Die Variable j wird mit dem Wert der Variablen i initialisiert.

Hier ist auch eine Variante ohne Warnungen

  for(int i = 0, j; i < 10; j = i)
   {
    j = i+1;
   }
 
Alexey Viktorov:

Ich habe nicht studiert, um Programmierer zu werden, ich kann nur logisch spekulieren, so wie Wassili Iwanowitsch und Petka über Logik spekuliert haben.

Im ersten Fall wird die gesamte Zeichenkette ausgeführt

und hier wird die Variable j nicht initialisiert, sondern ihr Wert wird der Variablen i zugewiesen

Und wer hat es studiert? Ich denke, die meisten Leute hier (wie ich) sind Autodidakten.

Sie müssen den for-Schleifenoperator studieren, um die Abfolge der Operationen zu verstehen. In (1) wird der Variablen j der Wert von i+1 zugewiesen

j = i+1

bevor es rechts neben dem Zuweisungsoperator erscheint

i = j
 
Valeriy Yastremskiy:

Die globalen Variablen scheinen mit Null initialisiert zu sein, aber der Körper der Funktion ist beim ersten Durchlauf auf andere Initialisierungen gestoßen.
Ich versuche immer, vor der Benutzung zu initialisieren. Ich stimme zwar zu, aber das Verhalten sollte eindeutig sein.

Und eine weitere Deklaration im Schleifenkörper, in Klammern, macht die Variable lokal für die Schleife. Die Ärzte haben es einfach nicht drauf.

Ja, ich initialisiere auch immer Variablen, das ist wie zwei mal zwei,ich sollte immer daran denken.
Das habe ich von der Sprache C in den Kopf bekommen))
Dieses Beispiel einer Schleife mit einer nicht initialisierten Variablen ist also schlechte Praxis.

 
Roman:

Ja, ich initialisiere auch immer Variablen, das ist wie zwei mal zwei,muss man sich immer merken.
Das habe ich von der Sprache C in den Kopf bekommen))
Dieses Beispiel einer Schleife mit einer nicht initialisierten Variablen ist also schlechte Praxis.

Sie müssen ihn initialisieren, aber nur mit einem sinnvollen Wert. Im obigen Beispiel gibt es keinen solchen Wert, so dass dies keine schlechte Praxis ist und die einzig mögliche Methode darstellt. Andernfalls würde es eine doppelte Initialisierung geben

int f( int i ) { /*вычисления*/ }
void g( int k )
{
        for ( int i = 0, j; i < k; i = j )
        {
                j = f( i );
                /*вычисления*/
        }
}
 
A100:

Initialisieren, aber nur mit einem sinnvollen Wert. In dem obigen Beispiel gibt es keinen solchen Wert, also ist die Praxis nicht schlecht, sondern die einzig mögliche. Andernfalls käme es zu einer doppelten Initialisierung

Was würde es ändern, wenn Sie

int f( int i ) { /*вычисления*/ }
void g( int k )
{
   for ( int i=0, j=0; i < k; i = j )
   {
      j = f( i );
      /*вычисления*/
   }
}       
 
Roman:

Was würde sich ändern, wenn sie mit j=333 initialisiert würde?

Und warum bei Null und nicht bei j=333? D.h. es handelt sich um eine sinnlose Initialisierung, die einen schwer zu findenden Fehler verbergen kann.

 
A100:

Warum Null und nicht etwa 333? D.h. es handelt sich um eine bedeutungslose Initialisierung, hinter der sich ein schwer zu erkennender Fehler verbergen kann.

Wenn Sie einen Fehler bei diesem Wert abfangen müssen, initialisieren Sie ihn mit 333 ))
Es ist nur ein Startwert.

Grund der Beschwerde: