Dichiarare le variabili dietro il ciclo o dentro il ciclo? - pagina 7

 
Alexey Volchanskiy:

Ho appena incontrato un gruppo di persone che pensano che il compilatore azzeri le variabili locali proprio come fa con le variabili globali.

E il compilatore non fa alcun warping.

Lo fa, string e print non sono indicatori di lavoro con le variabili

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

possibile uso di una variabile non inizializzata 'c' tst.mq5 16 10

possibile uso di una variabile non inizializzata 'e' tst.mq5 20 17

codice generato 1 1

0 errore(i), 2 avviso(i), 526 msec trascorsi 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;
        }
}

tempo = 1018
somma = 894782460
tempo = 371
somma = 894782460

Non so perché, ma μl supera fortemente (e le varianti più intricate di rand()).

E per me è ovvio: toglierlo dal giro.

 
Alexey Volchanskiy:

Ho appena incontrato un gruppo di persone che pensano che il compilatore azzeri le variabili locali proprio come fa con le variabili globali.

E il compilatore non dà alcun mandato.

Oppure .... Non lo so. Lo faccio imprecare ad ogni occasione .... ))))))

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

Oppure .... Non lo so. Giuro così ogni volta che posso.... ))))))

Hai una versione oscena del compilatore)
 
Vict:

tempo = 1018
somma = 894782460
tempo = 371
somma = 894782460

Non so perché, ma μl è molto più avanti della curva (e delle varianti più intricate di rand()).

E per me è ovvio: toglierlo dal giro.

Non sono un guru, ma qui, a mio modesto parere, dichiarare le variabili in un ciclo è un affare ENORME (e non lo è più) !!!

Una cosa è una funzione, anche un pezzo di codice locale, ma loops....

Potrei sbagliarmi ))))))))

 
Dmitriy Skub:
Hai una versione oscena del compilatore)

E ne sono felice ))))))))))) Anche se a volte .... Preferirei che non dicesse nulla )))))))))))))))))))))))))))))))

 

Se questo è un dibattito - voglio chiedere al Guru.

Che è "corretto" (ottimale e leggibile):

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

Oppure

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

Se l'ordine di i è indifferente?

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

Non sono un guru, ma qui, a mio modesto parere, dichiarare le variabili in un ciclo è un affare ENORME (e non lo è più) !!!

Una cosa è una funzione, anche un pezzo di codice locale, ma loops....

Potrei sbagliarmi ))))))))

Non possibile, ma sicuramente sbagliato. Solo un esempio: Si passa in rassegna le posizioni aperte. Se ottieni un biglietto di posizione, usalo per ottenere altre proprietà di posizione. Ci sono due varianti, o in ogni funzione di ottenere la proprietà della posizione inserire PositionGetTicket(i) o scriverlo in una variabile una volta e usarlo. Ma dopo l'uscita dal ciclo nessuno ha bisogno di questo biglietto... Perché dichiarare questa variabile nel corpo della funzione OnTick() o ancora più interessante a livello globale?
 
Mikhail Dovbakh:

Se questo è un dibattito - voglio chiedere al Guru.

Che è "corretto" (ottimale e leggibile):

Oppure

Se l'ordine di i è indifferente?

Penso che la prima opzione, perché non ci sono variabili extra, non solo usano la memoria, ma per me, ingombrano il codice - leggere di più, ma dipende dalle funzioni che chiamate imho, se la funzione è usata raramente, allora a volte sarà più leggibile, se si dichiara una variabile con un nome nel senso del compito eseguito.... tutto sommato, questo è un problema creativo ))))

ma in generale, non ascoltateli, scrivete come volete - usate la lingua per la vostra convenienza

SZZ: guardate gli esempi da mikrosoft, lo stile per lo più - dichiarazioni in una volta quando si usano le variabili, in pratica si ottiene lo scope locale, ma senza fanatismo ))

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:

Se questo è un dibattito - voglio chiedere al Guru.

Che è "corretto" (ottimale e leggibile):

Oppure

Se l'ordine di i è indifferente?

Se indifferente allora.

int i = Bars();

while(i-- > 0) 

{

// code

}

.

Motivazione: