Saya akan mulai dari pertanyaan terakhir Anda
Juga, mengapa kompiler atau IDE tidak mengeluh tentang main () tidak mengembalikan int?
Menurut Standar C ++ (6.6.1 fungsi utama)
5 Pernyataan return in main memiliki efek meninggalkan fungsi utama (menghancurkan objek dengan durasi penyimpanan otomatis) dan memanggil std :: exit dengan nilai return sebagai argumen. Jika kontrol mengalir dari akhir pernyataan-senyawa utama, efeknya setara dengan pengembalian dengan operan 0 (lihat juga 18.3).
Dan relatif terhadap pertanyaan ini
Bagaimana ini mungkin, karena y = 5 bukan ekspresi yang dapat dihitung?
Dari Standar C ++ (8.18 Operator penugasan dan tugas gabungan)
1 Operator penugasan (=) dan semua operator penugasan gabungan semua grup kanan-ke-kiri. Semua membutuhkan nilai yang dapat dimodifikasi sebagai operan kiri mereka dan mengembalikan nilai yang mengacu pada operan kiri.
Sp deklarasi ini
int x{ y = 5 };
dapat dibagi secara ekivalen menjadi dua pernyataan
y = 5;
int x{ y };
Terlebih lagi dalam C ++ Anda bahkan dapat membuat referensi ke variabel y dengan cara berikut
int &x{ y = 5 };
Ini adalah program demonstratif
#include <iostream>
int main()
{
int y;
int &x{ y = 5 };
std::cout << "y = " << y << '\n';
x = 10;
std::cout << "y = " << y << '\n';
}
Outputnya adalah
y = 5
y = 10
Anda dapat deklarasi ini
int x{ y = 5 };
menulis ulang juga suka
int x = { y = 5 };
Namun, perhatikan bahwa ada perbedaan antara keduanya (terlihat sama dengan deklarasi di atas) dua deklarasi.
auto x{ y = 5 };
dan
auto x = { y = 5 };
Dalam deklarasi pertama variabel x
memiliki tipe int
. Dalam deklarasi kedua variabel x
memiliki tipe std::initializer_list<int>
.
Untuk membuat perbedaan lebih terlihat, lihat bagaimana nilai-nilai objek dikeluarkan.
#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;
}
Output program adalah
x1 = 5
*x2.begin()= 10
y = 10
y = 5
adalah ekspresi, dan memiliki nilai5
. Menurut Anda mengapa tidak?