int main() {
int y;
int x{ y = 5 };
//x is 5
}
Bagaimana ini mungkin, karena y = 5 bukan ekspresi yang dapat dihitung?
Juga, mengapa kompiler atau IDE tidak mengeluh tentang main () tidak mengembalikan int?
c++
initialization
declaration
assignment-operator
counterstriker0
sumber
sumber
y = 5
adalah ekspresi, dan memiliki nilai5
. Menurut Anda mengapa tidak?return
darimain
, lihat pertanyaan ini .y = 5
menghasilkan 5 di sini. Kemungkinan operator penugasan untuk mengembalikan sesuatu memang fitur aneh dari C / C ++.Jawaban:
Saya akan mulai dari pertanyaan terakhir Anda
Menurut Standar C ++ (6.6.1 fungsi utama)
Dan relatif terhadap pertanyaan ini
Dari Standar C ++ (8.18 Operator penugasan dan tugas gabungan)
Sp deklarasi ini
dapat dibagi secara ekivalen menjadi dua pernyataan
Terlebih lagi dalam C ++ Anda bahkan dapat membuat referensi ke variabel y dengan cara berikut
Ini adalah program demonstratif
Outputnya adalah
Anda dapat deklarasi ini
menulis ulang juga suka
Namun, perhatikan bahwa ada perbedaan antara keduanya (terlihat sama dengan deklarasi di atas) dua deklarasi.
dan
Dalam deklarasi pertama variabel
x
memiliki tipeint
. Dalam deklarasi kedua variabelx
memiliki tipestd::initializer_list<int>
.Untuk membuat perbedaan lebih terlihat, lihat bagaimana nilai-nilai objek dikeluarkan.
Output program adalah
sumber
Ini adalah tugas, dan tugas menghasilkan nilai-nilai, yaitu "tipe cv-wajar tanpa pengecualian dari operan kiri", lihat [expr.ass / 3] . Oleh karena itu
y = 5
menghasilkany
, yang5
, yang digunakan untuk menginisialisasix
.Sehubungan dengan pertanyaan kedua Anda, lihat cppreference di main (atau [basic.start.main / 5] ):
Oleh karena itu, kompiler atau IDE memperingatkan Anda tentang
return
pernyataan yang hilang pada akhirmain
akan menjadi salah. Memang, fakta bahwa Anda harus selalureturn
objek dari non-void
fungsi execptmain
adalah jenis ... well, untuk alasan historis kurasa.sumber
return
. -pedanticThe
operator=()
menghasilkan nilai, yang merupakan nilai yang diberikan untuk variabel. Karena hal ini, dimungkinkan untuk menetapkan tugas seperti ini:sumber
Jika Anda melihat dokumentasi di cppreference , Anda akan melihat bahwa
operator=()
mengembalikan referensi ke objek yang ditugaskan. Oleh karena itu, tugas dapat digunakan sebagai ekspresi yang mengembalikan objek yang ditugaskan.Kemudian, itu hanya tugas normal dengan kawat gigi.
sumber