เริ่มต้นตัวแปรหลายตัวโดยคั่นด้วยเครื่องหมายจุลภาค ','

ใช้ C ++ 14 หากฉันต้องการประกาศและเริ่มต้นจำนวนเต็มสองตัวในคำสั่งเดียวกัน (โดยใช้ตัวคั่นลูกน้ำ):

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

จากนั้นเฉพาะตัวแปรที่ถูกต้องที่สุด (j) เท่านั้นที่จะเริ่มต้นอย่างถูกต้อง อันที่จริงคอมไพเลอร์ส่งออกข้อความเตือน:

คำเตือน: 'i' ถูกใช้โดยไม่ได้กำหนดค่าเริ่มต้นในฟังก์ชันนี้ [-Wuninitialized]

แน่นอนว่าวิธีแก้ปัญหาคือการทำซ้ำกับตัวแปรแต่ละตัว

int i=0, j=0;

แต่คำถามคือ:

มีวิธีการเริ่มต้นตัวแปรหลายตัวอย่างถูกต้องด้วยตัวดำเนินการกำหนดเพียงตัวเดียวหรือไม่?


person Pierre Nicolas    schedule 08.01.2018    source แหล่งที่มา
comment
ไม่ก็ไม่มี   -  person Some programmer dude    schedule 08.01.2018
comment
มีอยู่ใน C ++ 17 ดังที่ Caleth แสดง ก่อนหน้านั้น อย่างน้อยคุณสามารถหลีกเลี่ยงการใช้ rhs ซ้ำได้โดยใช้ int i = j = 0 ไปเรื่อยๆ แต่ฉันไม่อยากสนับสนุนอย่างนั้น...   -  person underscore_d    schedule 08.01.2018
comment
เครื่องหมายเท่ากับใน int i=0; ไม่ใช่การกำหนด... แต่เป็นการประกาศด้วยค่าเริ่มต้น คุณจะแยกแยะกรณีของ int i, j = 0; ที่คุณไม่ต้องการให้ i เตรียมใช้งานและตัวแปรทั้งสองเตรียมใช้งานให้เป็นค่าเดียวกันได้อย่างไร แล้ว int i = 0, j; ควรหมายถึงอะไร?   -  person Luis Colorado    schedule 09.01.2018
comment
เพื่อแยกแยะความแตกต่างคุณสามารถเขียนคำสั่งเหล่านั้นด้วยคำสั่งที่แตกต่างกันสองคำสั่ง แต่จริงๆ แล้ว คำถามของฉันมีมากกว่านั้น: ถ้าฉันต้องการสร้างตัวแปร 26 ตัวติดต่อกันและฉันขี้เกียจเกินไปที่จะเริ่มต้นตัวแปรทีละตัว (int a=0, b=0, ... , z=0) ฉันจะทำอย่างไร มีวิธีแก้ไขไหม?   -  person Pierre Nicolas    schedule 11.01.2018


คำตอบ (3)


น่าเสียดายที่ไม่ มันเป็นการเล่นโวหารของไวยากรณ์

int i(0), j(0);

เป็นทางเลือกหนึ่ง ใช้ได้ตั้งแต่ C++98 หากคุณไม่ชอบการทำซ้ำตัวอักษร 0 อย่างน้อยคุณก็เขียนตั้งแต่ C ++ 11 เป็นต้นไปได้

int i{}, j{};
person Bathsheba    schedule 08.01.2018
comment
และด้วย C++ 11 คุณอาจใช้ int i{ 0 }, j{ 0 }; ได้เช่นกัน - person Carl; 08.01.2018
comment
s/เศร้า/มีความสุข อย่าสนับสนุนให้มีการประกาศหลายรายการ ไม่เช่นนั้น คุณจะลงเอยด้วย int * i, j = nullptr; ฯลฯ - person Caleth; 08.01.2018
comment
@Carl: ยิ่งกว่านั้นคุณสามารถวางศูนย์ได้ - person Bathsheba; 08.01.2018
comment
ใช่! แต่สิ่งที่แย่ก็คือฉันทำซ้ำ '{}' แทน '=0' ;-) - person Pierre Nicolas; 11.01.2018
comment
@GenghisCat: ใช่ แต่คุณไม่ได้ทำซ้ำค่าตามตัวอักษรจริงๆ นั่นก็ทำให้ฉันพอใจกับการเขียนโปรแกรมแบบ DRY อย่างน้อยที่สุด en.wikipedia.org/wiki/Don%27t_repeat_yourself - person Bathsheba; 11.01.2018

ใน C++17 และใหม่กว่า คุณสามารถ:

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

คุณสามารถเริ่มต้นตัวแปรหลายตัวด้วยโอเปอเรเตอร์ที่ได้รับมอบหมายเพียงตัวเดียว แต่จะไม่สามารถใช้เมื่อประกาศตัวแปรเหล่านั้น:

int i, j;
std::tie(i, j) = std::make_tuple(0, 0);
person piwi    schedule 08.01.2018
comment
และใน C++17 และใหม่กว่า คุณสามารถ auto [i, j] = std::tuple(0, 0); - person Caleth; 08.01.2018
comment
คือถ้าไม่ใช่ตอนประกาศ แสดงว่าไม่ใช่ Initialize ใช่ไหมครับ? มันเป็นงานที่ได้รับมอบหมาย ตัวแปรจะถูกทิ้งไว้โดยไม่ได้ตั้งใจระหว่างการประกาศและการมอบหมาย ซึ่งเป็นแนวปฏิบัติที่ไม่ดี มีความเสี่ยง และเป็นไปไม่ได้สำหรับประเภทที่ไม่สามารถมอบหมายได้ โดยพื้นฐานแล้วตามคำพูดนี้ไม่ได้ตอบคำถาม - person underscore_d; 08.01.2018
comment
@underscore_d แน่นอนว่ามันไม่ใช่การเริ่มต้น แย่จัง ส่วนการปฏิบัติที่ไม่ดีและความเสี่ยงนั้นยังเป็นที่ถกเถียงกันอยู่และขึ้นอยู่กับบริบทจริงๆ - person piwi; 08.01.2018