Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 202

 
Bu konuyla ilgili olmayan yorumlar " MQL5 MT5 MetaTrader 5 Yeni Başlayanlardan Sorular " bölümüne taşındı.
 

Normal işlevler, argümanları soldan sağa alır.

Özel - sağdan sola.

 double f1()
{
   Print ( __FUNCSIG__ );
  
   return ( 0 );
}

double f2()
{
   Print ( __FUNCSIG__ );
  
   return ( 0 );
}

void Func( double , double )
{
}

#define PRINT(A) Print ( #A); A

void OnStart ()
{  
  PRINT( MathMin (f1(), f2()));
  
  PRINT(Func(f1(), f2()));
}


Sonuç.

         MathMin (f1(),f2())
         double f1()
         double f2()
        Func(f1(),f2())
         double f2()
         double f1()


Yani amaçlandı mı?

 
fxsaber :

Yani amaçlandı mı?

Bu, güvenilemeyecek bir UB'dir. Onlar. programın mantığının argümanların değerlendirme sırasına bağlı olduğu durumlardan açıkça kaçınmak gerekir.

 
fxsaber :

Normal işlevler, argümanları soldan sağa alır.

İşte bir karşı örnek:

 string f1() { Print ( 1 ); return NULL ; }
string f2() { Print ( 2 ); return NULL ; }
void OnStart ()
{
     StringCompare (f1(), f2());
}

Sonuç: 2 1

 
Andrei Trukhanovich :

Bu, güvenilemeyecek bir UB'dir. Onlar. programın mantığının argümanların değerlendirme sırasına bağlı olduğu durumlardan açıkça kaçınmak gerekir.

A100 :

İşte bir karşı örnek:

Personel ile her şeyin kararsız olduğu ortaya çıktı. Kullanıcı ile - kesinlikle en baştan.

 
fxsaber :

Personel ile her şeyin kararsız olduğu ortaya çıktı. Özel ile - kesinlikle en baştan.

Aradaki fark, normal işlevler (sağdan sola) ve satır içi işlevler (belirsiz sıra) olmasıdır.

satır içi işlevler hiç işlev değildir, yani. onların bir adresi yok. Bu açıdan, standart ve kullanıcı arasında hiçbir fark yoktur, bu nedenle, örneğin, en basit kullanıcı işlevinin (esas olarak satır içi olan) argümanları neden her zaman sağdan sola hesapladığı açık değildir. Gelecekte satır içi işlevler için sıranın değişebileceğini dışlamıyorum, bu nedenle

Bir keresinde, hesaplama sırasını güvenle kullanmak için satır içi anahtar kelimeyi tanıtmayı önermiştim:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

A100 , 2017.10.05 14:30

Bu, C++ satır içi anahtar sözcüğünün kullanışlılığını bir kez daha kanıtlıyor (burada eski olduğu iddia edilen bir görüş vardı).
Diğer şeylerin yanı sıra, satır içi aslında programcının işlev parametrelerinin değerlendirme sırasını kullanmayı reddettiği anlamına gelir ve derleyici işlevi satır içi yapmaya karar verirse, derleyici doğrudan değerlendirme sırasını daha verimli olarak kullanabilir (tersi değerlendirme açıkça yalnızca çağrılan işlevler için etkilidir).
Aynı zamanda, derleyici satır içi olmayan bir işlevi satır içi yapmaya karar verirse, bu, verimlilik kaybına yol açsa bile (genel) ters değerlendirme sırasını kullanmalıdır (çünkü programcı, bildirimde bulunmadan bu sıraya güvenmiştir). işlev satır içi)

değerlendirme sırasının açıkça kontrol edilemediği MQL'de satır içi de uygun olacaktır.


 
A100 :

Aradaki fark, normal işlevler (sağdan sola) ve satır içi işlevler (belirsiz sıra) olmasıdır.

satır içi işlevler hiç işlev değildir, yani. onların bir adresi yok. Bu açıdan, standart ve kullanıcı arasında hiçbir fark yoktur, bu nedenle, örneğin, en basit kullanıcı işlevinin (esas olarak satır içi olan) argümanları neden her zaman sağdan sola hesapladığı açık değildir. Gelecekte satır içi işlevler için sıranın değişebileceğini dışlamıyorum, bu nedenle

Bir keresinde, hesaplama sırasını güvenle kullanmak için satır içi anahtar kelimeyi tanıtmayı önermiştim:

Açıklama için teşekkürler, satır içi hakkında düşünmedim.

 __forceinline void Func( double , double )

Bu seçenek sonucu etkilemez.

 
fxsaber :

Açıklama için teşekkürler, satır içi hakkında düşünmedim.

Bu seçenek sonucu etkilemez.

Şimdi etkilemiyor, çünkü MQL'de şimdi orada değil gibi görünüyor

 #define inline

ve gelecekte gerçek anlamla doldurulabilir, yoksa neden tanıtılsın ki?

 
A100 :

Şimdi etkilemiyor, çünkü MQL'de şimdi orada değil gibi görünüyor

ve gelecekte gerçek anlamla doldurulabilir, yoksa neden tanıtılsın ki?

Sürümün yardımından hatırladığım kadarıyla, *.h dosyalarının satır içine alınabilmesi için onu bir saplama olarak tanıtmışlardı.

 
Dönüşü işlev argümanları olarak geçirilen işlevlerin çağrılma sırasına gelince, c++ standardı, derleyiciye değerlendirildikleri sıraya göre gereksinimler getirmez, herhangi bir sırayla çağrılabilirler ( https://en.cppreference. com/w/cpp/language /eval_order ). Analojinin mql'ye ne ölçüde uygulanabilir olduğu - soru zaten geliştiriciler içindir, belirleyebilirler veya rahatsız etmemiş olabilirler.
Neden: