在循环后面声明变量还是在循环里面声明变量? - 页 7

 
Alexey Volchanskiy:

刚刚遇到一群人,他们认为编译器对局部变量 的归零就像对全局变量一样。

而且,编译器不会给出清算的结果。

它是这样的,字符串和打印并不是处理变量的指标。

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

可能使用未初始化的变量'c' tst.mq5 16 10

可能使用未初始化的变量'e' tst.mq5 20 17

代码生成 1 1

0个错误(s),2个警告(s),526毫秒的时间 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;
        }
}

时间=1018
总和=894782460
时间 = 371
总和=894782460

我不知道为什么,μl强烈地超过了(以及更复杂的rand()变体)。

而对我来说,这很明显--把它从循环中拿出来。

 
Alexey Volchanskiy:

刚刚遇到一群人,他们认为编译器对局部变量 的归零就像对全局变量一样。

而编译器并没有发出任何授权书。

或....我不知道。我一有机会就拿它来发誓,....))))))

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

或....我不知道。我一有机会就这样发誓,....))))))

你有一个淫秽版本的编译器)
 
Vict:

时间=1018
总和=894782460
时间 = 371
总和=894782460

我不知道为什么,但μl领先于曲线(以及更复杂的rand()变体)。

而对我来说,这很明显--把它从循环中拿出来。

我不是大师,但在这里,以我的愚见,在一个循环中声明变量 是一个巨大的问题(现在已经不是一个巨大的问题了)!!。

一件事是一个函数,甚至是一个局部代码,但loops....

我可能是错的 ))))))))

 
Dmitriy Skub:
你有一个淫秽版本的编译器)

而且我很高兴,)))))))))))虽然有时....我宁愿他什么都不说 )))))))))))))))))))))))))))))))

 

如果这是一场辩论--我想问大师。

哪个是 "正确的"(最佳和可读的)。

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

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

如果i的顺序是无所谓的?

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

我不是大师,但在这里,以我的愚见,在一个循环中声明变量 是一个巨大的问题(现在已经不是一个巨大的问题了)!!。

一件事是一个函数,甚至是一个局部代码,但loops....

我可能是错的 ))))))))

不可能,但肯定是错的。仅举一例。你在开放的位置上进行循环。你得到了一张位置票,用它来获得其他位置属性。有两种变体,要么在获取位置属性的每个函数中插入PositionGetTicket(i),要么把它写在一个变量中,使用它。但当循环退出后,就不需要这个票了。为什么要在OnTick()函数的主体中声明这个变量,或者更有趣的是在全局层面声明?
 
Mikhail Dovbakh:

如果这是一场辩论--我想问大师。

哪个是 "正确的"(最佳和可读的)。

如果i的顺序是无所谓的?

我认为第一种选择,因为没有额外的变量,它们不仅使用内存,而且对我来说,杂乱无章的代码 - 阅读更多,但这取决于你调用的函数imho,如果函数很少使用,那么有时它将是更可读的,如果你声明一个变量的名称在执行任务的意义....。总而言之,这是一个创造性的问题 ))))

但一般来说,不要听他们的,随心所欲地写--为了自己的方便而使用这些语言

SZZ:看看mikrosoft的例子,风格大多是--使用变量时一次性声明,基本得到局部范围,但不狂热))

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:

如果这是一场辩论--我想问大师。

哪个是 "正确的"(最佳和可读的)。

如果i的顺序是无所谓的?

如果无动于衷,那么。

int i = Bars();

while(i-- > 0) 

{

// code

}

.