Merhaba,
Sadece const'u anlamak için long.max sınırları içinde kalan Mp = 2 ^ n - 1 Mersenne asallarını hesaplar ve sonunda ilginç sonuçlar çıkar...
/***
* 6. Mp,
* n = 17:
* 131071 de asal bir sayıdır
*
**********************************/
class MersennePrime
{
const long C;
long e, c;
this(long e, const long C)
{
this.e = e;
this.C = C;
this.c = C;
}
const
{
// 1a => long
auto constTestc() { return (2^^e) + c; }
// 1b => long
auto constTestc_i() { return cast(const long)(2^^e) + cast(int)c; }
// 1c => const(long)
auto constTestc_cc() { return cast(const long)(2^^e) + c; }
}
// 1d => long
auto constTestc_c() { return cast(const long)(2^^e) + c; }
// 2a => const(long)
auto constTestC() { const result = 2^^e; return result + C; }
// 2b => long
auto constTestc_I() { return cast(const long)(2^^e) + cast(int)C; }
// 2c => long
auto constTestc_II() { return cast(const long)(2^^e) + cast(const int)C; }
// 2d => const(long)
auto constTestc_C() { return cast(const long)(2^^e) + C; }
}
enum : long {
l = 17,//61,
a = -1
}
import std.stdio;
void main()
{
// Access Via Object :
auto Mp = new MersennePrime(l, a);
typeid(Mp.constTestc).writeln(", 1a: ", Mp.constTestc); // long
typeid(Mp.constTestc_i).writeln(", 1b: ", Mp.constTestc_i); // long
typeid(Mp.constTestc_cc).writeln(", 1c: ", Mp.constTestc_cc); // const(long)
typeid(Mp.constTestc_c).writeln(", 1d: ", Mp.constTestc_c); // long
writeln;
typeid(Mp.constTestC).writeln(", 2a: ", Mp.constTestC); // const(long)
typeid(Mp.constTestc_I).writeln(", 2b: ", Mp.constTestc_I); // long
typeid(Mp.constTestc_II).writeln(", 2c: ", Mp.constTestc_II); // long
typeid(Mp.constTestc_C).writeln(", 2d: ", Mp.constTestc_C); // const(long)
// Access Via Local Function:
auto constTestc() const {
return 2 ^^ l + a;
}
auto constTestcc() const {
const result = 2^^l;
return result + a;
}
auto constTestc_c() const {
return cast(const long)(2) ^^ l + a;
}
writeln;
typeid( constTestc() ).writeln(": ", constTestc); // long
typeid( constTestcc() ).writeln(": ", constTestc); // long
typeid( constTestc_c() ).writeln(": ", constTestc_c); // long
} /* ÇIKTISI:
long, 1a: 131071
long, 1b: 131071
const(long), 1c: 131071
long, 1d: 131071
const(long), 2a: 131071
long, 2b: 131071
long, 2c: 131071
const(long), 2d: 131071
long: 131071
long: 131071
long: 131071
*/
Öncelikle yapamadığım 2 bilgi:
- 1.'si, main() veya bir yapı/sınıf dışında serbest işleve const veremiyorsunuz. Şu hatayı alıyorum:
without this
cannot be const
- 2.'si, main() içinde const { // ... } bloğu çalışmıyor. Hemen yukarda denediğim gibi bir işe yaramasa da hatasız kabul ediyor.
Asıl işe yaradığı olasılıkları sınıf içinde görmekteseniz. Ama nedense, sadece 1c, 2a ve 2d'de const döndürebildim. Elbette başka olasılıklar da (const döndüren vardır ama nedense şu olasılıklarda bir türlü const döndürülemiyor:
-
1a: Tabii ki de bu normal, auto özelliği const çıkarsayamaz ama dıştaki const bloğu ne yapar diye merak ettim.
-
1b: Dönüşü yapılan toplamlardan soldaki const. Ve evet sağdaki değil ama dikkat türü int. Sanki farklı türde 2 değişken toplanırsa dıştaki const etkisiz kalıyor. Çünkü sonraki 1c'de bunu görmemekteyiz: const long + long sorun yok.
-
1d: Bu 1c ile büyük çoğunlukla aynı tek farkı const bloğu içinde olmaması. O yüzden etkisini göremiyoruz.
-
2b: Tıpkı 1b'deki gibi const long + int toplanıyor. Bu yüzden const bloğu içinde olması hiçbir şeyi değiştirmezdi.
-
2c: Ama bu şaşırtıcı çünkü her ikisi de const. Hatta const bloğu içinde olsaydı bile bir şey değişmeyecekti.
Aslında 2a ile ile 2d birbirinin aynısı. Dolayısıyla toplanan değerler const ise çıkış da const olabildiğini görüyoruz. Ama 2 üssü int bir sayı const olmayı etkilemiyor ve sanırım tabanın const olması yeterli.
Başarılar...