Son sorunuzdan başlayacağım
Ayrıca, neden derleyici veya IDE bir int döndürmüyor main () şikayet etmiyor?
C ++ Standardına göre (6.6.1 ana işlevi)
5 Bir return deyimi, ana işlevi terk etme (otomatik depolama süresi olan herhangi bir nesneyi yok etme) ve argüman olarak dönüş değeri ile std :: exit öğesini çağırma etkisine sahiptir. Kontrol, ana bileşiğin ifadesinin sonundan akarsa, etki 0 işlenenli bir dönüşe eşdeğerdir (ayrıca bkz. 18.3).
Ve bu soruya göre
Bu nasıl mümkündür, çünkü y = 5 hesaplanabilir bir ifade değildir?
C ++ Standardından (8.18 Atama ve bileşik atama işleçleri)
1 Atama operatörü (=) ve bileşik atama operatörleri sağdan sola gruplandırılır. Hepsi sol işlenen olarak değiştirilebilir bir değer gerektirir ve sol işlenene referansla bir değer döndürür.
Sp bu beyan
int x{ y = 5 };
eşdeğer olarak iki ifadeye bölünebilir
y = 5;
int x{ y };
Dahası C ++ 'da y değişkenine aşağıdaki şekilde bir referans bile yapabilirsiniz
int &x{ y = 5 };
İşte örnek bir program
#include <iostream>
int main()
{
int y;
int &x{ y = 5 };
std::cout << "y = " << y << '\n';
x = 10;
std::cout << "y = " << y << '\n';
}
Çıkışı
y = 5
y = 10
Bu beyanı yapabilirsiniz
int x{ y = 5 };
ayrıca yeniden yaz
int x = { y = 5 };
Bununla birlikte, iki beyan arasında (yukarıdaki beyanlara benzer şekilde) iki fark arasında bir fark olduğunu dikkate alın.
auto x{ y = 5 };
ve
auto x = { y = 5 };
İlk bildirimde değişkenin x
tipi vardır int
. İkinci bildirimde değişkenin x
tipi vardır std::initializer_list<int>
.
Farkı daha görünür hale getirmek için, nesnelerin değerlerinin nasıl çıktılandığını görün.
#include <iostream>
int main()
{
int y;
auto x1 { y = 5 };
std::cout << "x1 = " << x1 << '\n';
auto x2 = { y = 10 };
std::cout << "*x2.begin()= " << *x2.begin() << '\n';
std::cout << "y = " << y << '\n';
return 0;
}
Program çıktısı
x1 = 5
*x2.begin()= 10
y = 10
y = 5
olan bir ekspresyon ve değere sahiptir5
. Neden olmadığını düşünüyorsun?