Deklarieren von Variablen hinter der Schleife oder innerhalb der Schleife? - Seite 7

 
Alexey Volchanskiy:

Ich habe gerade einen Haufen Leute kennengelernt, die glauben, dass der Compiler bei lokalen Variablen genauso wie bei globalen Variablen eine Nullstellung vornimmt.

Und der Compiler führt kein Warping durch.

Ja, string und print sind kein Indikator für die Arbeit mit Variablen

int a;
int b;

void OnStart()
  {
   b=a+100;
   int c;
   int d=c+5;
   for(int i=0;i<10;i++)
     {
      int e;
      int f=i+e;
     }
  }

'tst.mq5' tst.mq5 1 1

mögliche Verwendung einer nicht initialisierten Variablen 'c' tst.mq5 16 10

mögliche Verwendung einer nicht initialisierten Variablen 'e' tst.mq5 20 17

erzeugter Code 1 1

0 Fehler, 2 Warnung(en), 526 msec verstrichen 1 3

 
//c++
 int main() {
        int count= (int)10 e6;
        {
                auto t1 = chrono::high_resolution_clock::now();
                int sum=0;
                for (int i=0; i<count; i++) {
                        string st;
                        st = "12345678qwertyuioasdfgh";
                        sum += st[i%23];
                }
                auto t2 = chrono::high_resolution_clock::now();
                auto duration = chrono::duration_cast<chrono::milliseconds>( t2 - t1 ).count();
                cout << "time = " << duration << endl;
                cout << "sum = " << sum << endl;
        }

  
        {
                auto t1 = chrono::high_resolution_clock::now();
                int sum=0;
                string st = "";
                for (int i=0; i<count; i++) {
                        st = "12345678qwertyuioasdfgh";
                        sum += st[i%23];
                }
                auto t2 = chrono::high_resolution_clock::now();
                auto duration = chrono::duration_cast<chrono::milliseconds>( t2 - t1 ).count();
                cout << "time = " << duration << endl;
                cout << "sum = " << sum << endl;
        }
}

Zeit = 1018
Summe = 894782460
Zeit = 371
Summe = 894782460

Ich weiß nicht, warum, aber μl überholt stark (und die komplizierteren rand()-Varianten).

Und für mich liegt es auf der Hand, sie aus dem Kreislauf herauszunehmen.

 
Alexey Volchanskiy:

Ich habe gerade einen Haufen Leute kennengelernt, die glauben, dass der Compiler bei lokalen Variablen genauso wie bei globalen Variablen eine Nullstellung vornimmt.

Und der Compiler gibt keine Haftbefehle aus.

Oder .... Ich weiß es nicht. Ich bringe ihn bei jeder Gelegenheit zum Fluchen.... ))))))

 
Сергей Таболин:

Oder .... Ich weiß es nicht. Ich fluche so oft ich kann.... ))))))

Sie haben eine obszöne Version des Compilers)
 
Vict:

Zeit = 1018
Summe = 894782460
Zeit = 371
Summe = 894782460

Ich weiß nicht, warum, aber μl ist der Kurve (und den komplizierteren rand()-Varianten) weit voraus.

Und für mich liegt es auf der Hand, sie aus dem Kreislauf herauszunehmen.

Ich bin kein Guru, aber meiner bescheidenen Meinung nach ist das Deklarieren von Variablen in einer Schleife eine GROSSE Sache (und es ist nicht mehr eine GROSSE Sache) !!!

Eine Sache ist eine Funktion, sogar ein lokales Stück Code, aber Schleifen....

Ich kann mich irren ))))))))

 
Dmitriy Skub:
Sie haben eine obszöne Version des Compilers)

Und darüber bin ich froh: ))))))))))) Obwohl manchmal .... Mir wäre es lieber, wenn er nichts sagen würde )))))))))))))))))))))))))))))))

 

Wenn dies eine Debatte ist, dann möchte ich den Guru fragen.

Was ist "richtig" (optimal und lesbar):

for (int i=0;i<Bars();i++)
{
// code
}

Oder

int i,MaxBars=Bars()-1;
for (i=MaxBars;i>=0;i--;)
{
// code
}

Wenn die Reihenfolge von i indifferent ist?

 
Сергей Таболин:

Ich bin kein Guru, aber meiner bescheidenen Meinung nach ist das Deklarieren von Variablen in einer Schleife eine GROSSE Sache (und es ist nicht mehr eine GROSSE Sache) !!!

Eine Sache ist eine Funktion, sogar ein lokales Stück Code, aber Schleifen....

Ich kann mich irren ))))))))

Nicht möglich, aber definitiv falsch. Nur ein Beispiel: Sie gehen in einer Schleife durch die offenen Positionen. Sie erhalten ein Positionsticket, mit dem Sie weitere Positionseigenschaften abrufen können. Es gibt zwei Varianten, entweder fügen Sie in jeder Funktion zum Abrufen der Positionseigenschaft PositionGetTicket(i) ein oder Sie schreiben sie einmal in eine Variable und verwenden sie. Aber wenn die Schleife verlassen wird, wird dieses Ticket nicht benötigt... Warum sollte diese Variable im Hauptteil der Funktion OnTick() oder, was noch interessanter ist, auf globaler Ebene deklariert werden?
 
Mikhail Dovbakh:

Wenn dies eine Debatte ist, dann möchte ich den Guru fragen.

Was ist "richtig" (optimal und lesbar):

Oder

Wenn die Reihenfolge von i indifferent ist?

Ich denke, die erste Option, denn es gibt keine zusätzlichen Variablen, sie nicht nur Speicher verwenden, aber für mich, überladen den Code - mehr lesen, aber es hängt von den Funktionen, die Sie imho aufrufen, wenn die Funktion selten verwendet wird, dann manchmal wird es mehr lesbar, wenn Sie eine Variable mit einem Namen im Sinne der Aufgabe deklarieren.... Alles in allem ist dies ein kreatives Problem ))))

aber im Allgemeinen sollten Sie nicht auf sie hören, sondern schreiben, was Sie wollen - verwenden Sie die Sprache, wie es Ihnen passt

SZZ: Schauen Sie sich Beispiele von mikrosoft, der Stil meist - Deklarationen auf einmal bei der Verwendung von Variablen, im Grunde erhalten lokale Reichweite, aber ohne Fanatismus ))

void SimpleImage::CalculateDrawingRect()
{
    // Load our bitmap if necessary
    if (nullptr == m_bitmap)
    {
        if (FAILED(LoadBitmapFromShellItem()))
        {
            return;
        }
    }

    // Calculate bitmap rectangle
    float  boundingWidth = m_boundingRect.right - m_boundingRect.left;
    float b oundingHeight = m_boundingRect.bottom - m_boundingRect.top;

    float w idth = Direct2DUtility::GetRectWidth(m_clipRect);
    float h eight = Direct2DUtility::GetRectHeight(m_clipRect);

    if (!m_isHorizontal)
    {
        // Swap width and height to calculate boundaries
        float widthTemp = width;
        width = height;
        height = widthTemp;
    }

    if (width > boundingWidth)
    {
        // Width is larger than bounding box. Scale width to fit
        float scale = boundingWidth / width;
        width *= scale;
        height *= scale;
    }
https://github.com/microsoft
Microsoft
Microsoft
  • github.com
This repo is the official home of .NET on GitHub. It's a great starting point to find many .NET OSS projects from Microsoft and the community, including many that are part of the .NET Foundation.
 
Mikhail Dovbakh:

Wenn dies eine Debatte ist, dann möchte ich den Guru fragen.

Was ist "richtig" (optimal und lesbar):

Oder

Wenn die Reihenfolge von i indifferent ist?

Wenn gleichgültig dann.

int i = Bars();

while(i-- > 0) 

{

// code

}

.