Inisialisasi beberapa variabel yang dipisahkan dengan koma ','

Menggunakan C++14, jika saya ingin mendeklarasikan dan menginisialisasi dua bilangan bulat pada instruksi yang sama (menggunakan pemisah koma):

int i,j = 0;
std::cout << i << "," << j << std::endl;

Maka hanya variabel paling kanan (j) yang diinisialisasi dengan benar. Memang benar, kompiler mengeluarkan pesan peringatan:

peringatan: 'i' digunakan tidak diinisialisasi dalam fungsi ini [-Wuninitialized]

Tentu saja solusinya adalah mengulanginya pada setiap variabel

int i=0, j=0;

Tapi pertanyaannya adalah:

Apakah ada cara untuk menginisialisasi beberapa variabel dengan benar hanya dengan satu operator penugasan?


person Pierre Nicolas    schedule 08.01.2018    source sumber
comment
Tidak, tidak ada.   -  person Some programmer dude    schedule 08.01.2018
comment
Ada di C++17, seperti yang ditunjukkan Caleth. Sebelumnya, setidaknya Anda bisa menghindari pengulangan rhs dengan menggunakan int i = j = 0 dan seterusnya, tapi saya tidak terlalu ingin mendorongnya...   -  person underscore_d    schedule 08.01.2018
comment
Tanda sama dengan di int i=0; bukanlah sebuah penugasan... ini adalah deklarasi dengan nilai penginisialisasi. Bagaimana Anda membedakan kasus int i, j = 0; di mana Anda tidak ingin i diinisialisasi dan kedua variabel diinisialisasi ke kasus nilai yang sama? Lalu apa maksudnya int i = 0, j;?   -  person Luis Colorado    schedule 09.01.2018
comment
Untuk membedakannya maka Anda dapat menuliskannya dalam dua instruksi yang berbeda. Tapi memang, pertanyaan saya lebih dari itu: jika saya ingin membuat 26 variabel berturut-turut dan saya terlalu malas untuk menginisialisasinya satu per satu (int a=0, b=0, ... , z=0), apakah saya punya solusi?   -  person Pierre Nicolas    schedule 11.01.2018


Jawaban (3)


Sayangnya tidak; itu adalah kekhasan tata bahasanya.

int i(0), j(0);

adalah alternatif, valid dari C++98. Jika Anda tidak suka mengulang literal 0, maka Anda bisa, setidaknya untuk kasus khusus itu, menulis dari C++11 dan seterusnya

int i{}, j{};
person Bathsheba    schedule 08.01.2018
comment
Dan dengan C++ 11 Anda juga dapat menggunakan int i{ 0 }, j{ 0 }; - person Carl; 08.01.2018
comment
s/Sedih/Bahagia. Jangan mendorong banyak deklarasi, jika tidak, Anda akan mendapatkan int * i, j = nullptr; dll - person Caleth; 08.01.2018
comment
@Carl: bahkan lebih baik dari itu, Anda bisa menghilangkan angka nol. - person Bathsheba; 08.01.2018
comment
Ya! Namun hal buruknya adalah saya mengulangi '{}' bukannya '=0' ;-) - person Pierre Nicolas; 11.01.2018
comment
@GenghisCat: Ya, tetapi Anda tidak benar-benar mengulangi nilai literal. Setidaknya itu memuaskan pemrograman KERING dalam pikiran saya. en.wikipedia.org/wiki/Don%27t_repeat_yourself - person Bathsheba; 11.01.2018

Di C++17 dan yang lebih baru, Anda dapat:

auto [i, j] = std::tuple(0, 0);
person Caleth    schedule 08.01.2018

Anda dapat menginisialisasi beberapa variabel dengan satu operator penugasan, namun tidak saat mendeklarasikannya:

int i, j;
std::tie(i, j) = std::make_tuple(0, 0);
person piwi    schedule 08.01.2018
comment
Dan di C++17 dan yang lebih baru, Anda bisa auto [i, j] = std::tuple(0, 0); - person Caleth; 08.01.2018
comment
Nah, kalau bukan saat mendeklarasikan, berarti bukan inisialisasi ya? Itu sebuah tugas. Variabel dibiarkan tidak diinisialisasi antara deklarasi dan penugasan, yang merupakan praktik buruk, berisiko, dan tidak mungkin dilakukan untuk tipe yang tidak dapat ditetapkan. Lebih mendasarnya, seperti yang dikatakan, ini tidak menjawab pertanyaan. - person underscore_d; 08.01.2018
comment
@underscore_d Memang, ini bukan inisialisasi, salahku. Mengenai praktik buruk dan risikonya, hal tersebut masih bisa diperdebatkan dan sangat bergantung pada konteksnya. - person piwi; 08.01.2018