ฉันจะเริ่มจากคำถามสุดท้ายของคุณ
นอกจากนี้ทำไมคอมไพเลอร์หรือ IDE ไม่บ่นเกี่ยวกับ main () ไม่ส่งคืน int
ตามมาตรฐาน C ++ (ฟังก์ชั่นหลัก 6.6.1)
5 คำสั่ง return ใน main มีผลต่อการออกจากฟังก์ชั่นหลัก (ทำลายวัตถุใด ๆ ที่มีระยะเวลาการเก็บข้อมูลอัตโนมัติ) และการเรียก std :: exit พร้อมกับค่า return เป็นอาร์กิวเมนต์ หากการควบคุมไหลออกจากจุดสิ้นสุดของคำสั่งผสมของหลักผลจะเท่ากับผลตอบแทนกับตัวถูกดำเนินการ 0 (ดูเพิ่มเติมที่ 18.3)
และสัมพันธ์กับคำถามนี้
สิ่งนี้เป็นไปได้อย่างไรเนื่องจาก y = 5 ไม่ใช่นิพจน์ที่คำนวณได้?
จากมาตรฐาน C ++ (8.18 การกำหนดและตัวดำเนินการกำหนดผสม)
1 ตัวดำเนินการที่ได้รับมอบหมาย (=) และตัวดำเนินการกำหนดรวมกลุ่มทั้งหมดจากขวาไปซ้าย ทั้งหมดต้องการ lvalue ที่สามารถแก้ไขได้เป็นตัวถูกดำเนินการด้านซ้ายและส่งคืน lvalue ที่อ้างถึงตัวถูกดำเนินการด้านซ้าย
ประกาศนี้
int x{ y = 5 };
สามารถแบ่งเท่า ๆ กันเป็นสองงบ
y = 5;
int x{ y };
ยิ่งไปกว่านั้นใน C ++ คุณสามารถอ้างอิงถึงตัวแปร y ได้ด้วยวิธีต่อไปนี้
int &x{ y = 5 };
นี่คือโปรแกรมสาธิต
#include <iostream>
int main()
{
int y;
int &x{ y = 5 };
std::cout << "y = " << y << '\n';
x = 10;
std::cout << "y = " << y << '\n';
}
เอาท์พุทมันคือ
y = 5
y = 10
คุณสามารถประกาศนี้
int x{ y = 5 };
เขียนเหมือนกัน
int x = { y = 5 };
อย่างไรก็ตามให้คำนึงว่ามีความแตกต่างระหว่างสองสิ่งนี้ (ดูคล้าย ๆ กับการประกาศข้างต้น) สองการประกาศ
auto x{ y = 5 };
และ
auto x = { y = 5 };
ในการประกาศครั้งแรกตัวแปรที่มีชนิดx
int
ในการประกาศสองตัวแปรที่มีชนิดx
std::initializer_list<int>
เพื่อให้เห็นความแตกต่างได้ชัดเจนยิ่งขึ้นดูว่าค่าของวัตถุนั้นถูกส่งออกอย่างไร
#include <iostream>
int main()
{
int y;
auto x1 { y = 5 };
std::cout << "x1 = " << x1 << '\n';
auto x2 = { y = 10 };
std::cout << "*x2.begin()= " << *x2.begin() << '\n';
std::cout << "y = " << y << '\n';
return 0;
}
ผลลัพธ์ของโปรแกรมคือ
x1 = 5
*x2.begin()= 10
y = 10
y = 5
คือ5
การแสดงออกและมีความคุ้มค่า ทำไมคุณคิดว่ามันไม่ใช่