เกิดอะไรขึ้นที่นี่?
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.
}
ส่วน 6.4.3 ในมาตรฐาน 2003 อธิบายว่าตัวแปรที่ประกาศในเงื่อนไขคำสั่งการเลือกมีขอบเขตที่ขยายไปถึงจุดสิ้นสุดของส่วนย่อยที่ควบคุมโดยเงื่อนไขอย่างไร แต่ฉันไม่เห็นว่ามันพูดอะไรเกี่ยวกับการไม่สามารถใส่วงเล็บรอบคำประกาศหรือไม่พูดอะไรเกี่ยวกับการประกาศเพียงครั้งเดียวต่อเงื่อนไข
ข้อ จำกัด นี้น่ารำคาญแม้ในกรณีที่จำเป็นต้องมีการประกาศเพียงครั้งเดียวในเงื่อนไข พิจารณาสิ่งนี้.
bool a = false, b = true;
if(bool x = a || b)
{
}
หากฉันต้องการป้อนขอบเขต 'if' -body โดยตั้งค่า x เป็นเท็จการประกาศจำเป็นต้องมีวงเล็บ (เนื่องจากตัวดำเนินการกำหนดมีลำดับความสำคัญต่ำกว่าตรรกะ OR) แต่เนื่องจากไม่สามารถใช้วงเล็บได้จึงต้องมีการประกาศ x ภายนอก เนื้อความรั่วการประกาศนั้นไปยังขอบเขตที่ใหญ่กว่าที่ต้องการเห็นได้ชัดว่าตัวอย่างนี้เป็นเรื่องเล็กน้อย แต่กรณีที่เป็นจริงกว่านั้นน่าจะเป็นกรณีที่ a และ b เป็นฟังก์ชันที่ส่งคืนค่าที่ต้องได้รับการทดสอบ
ฉันต้องการทำสิ่งที่ไม่เป็นไปตามมาตรฐานหรือไม่หรือคอมไพเลอร์ของฉันแค่ทำลายลูกบอล (VS2008)
while
if
if (int a = foo(), int b = bar(), a && b)
? ถ้าตัวดำเนินการลูกน้ำไม่โอเวอร์โหลดมาตรฐานจะบอกว่านิพจน์จะถูกประเมินจากซ้ายไปขวาและค่าผลลัพธ์คือนิพจน์สุดท้าย ทำงานร่วมกับการfor
เริ่มต้นลูปทำไมไม่มาที่นี่
if
ทำงานและดูเหมือนว่าจะเป็นการสันนิษฐานที่ผิด
if
ตัวอย่างของคุณมีif
ไม่ใช่การวนซ้ำ แต่เป็นเงื่อนไข