Apa yang terjadi di sini?
if(int a = Func1())
{
// Works.
}
if((int a = Func1()))
{
// Fails to compile.
}
if((int a = Func1())
&& (int b = Func2()))
)
{
// Do stuff with a and b.
// This is what I'd really like to be able to do.
}
Bagian 6.4.3 dalam standar 2003 menjelaskan bagaimana variabel yang dideklarasikan dalam kondisi pernyataan pemilihan memiliki ruang lingkup yang meluas hingga akhir substrat yang dikontrol oleh kondisi tersebut. Tapi saya tidak melihat di mana dikatakan apa pun tentang tidak dapat menempatkan tanda kurung di sekitar deklarasi, juga tidak mengatakan apa pun tentang hanya satu deklarasi per kondisi.
Batasan ini mengganggu bahkan dalam kasus di mana hanya satu deklarasi dalam kondisi yang diperlukan. Pertimbangkan ini.
bool a = false, b = true;
if(bool x = a || b)
{
}
Jika saya ingin memasukkan 'if "-body scope dengan x disetel ke false maka deklarasi membutuhkan tanda kurung (karena operator penugasan memiliki prioritas lebih rendah daripada logika OR), tetapi karena tanda kurung tidak dapat digunakan, diperlukan deklarasi x di luar tubuh, membocorkan deklarasi itu ke lingkup yang lebih besar daripada yang diinginkan. Jelas contoh ini sepele tetapi kasus yang lebih realistis adalah kasus di mana a dan b adalah fungsi yang mengembalikan nilai yang perlu diuji
Jadi, apakah yang ingin saya lakukan tidak sesuai dengan standar, atau apakah kompiler saya hanya merusak bola saya (VS2008)?
while
sama seperti untuk if
.
if (int a = foo(), int b = bar(), a && b)
? Jika operator koma tidak kelebihan beban, standar mengatakan bahwa ekspresi dievaluasi dari kiri ke kanan, dan nilai hasil adalah ekspresi terakhir. Ia bekerja dengan for
inisialisasi loop, mengapa tidak di sini?
if
kerjanya, dan sepertinya anggapan itu salah.
if
.if
bukan sebuah loop, ini adalah sebuah kondisional.