บ่อยครั้งในรหัส ANSI C ฉันสามารถเห็นวงเล็บล้อมรอบค่าที่ส่งคืนเดียว
แบบนี้:-
int foo(int x) {
if (x)
return (-1);
else
return (0);
}
เหตุใดจึงใช้ () รอบค่าส่งคืนในกรณีเหล่านั้น มีความคิดอะไรบ้าง? ฉันไม่เห็นเหตุผลสำหรับเรื่องนั้น
บ่อยครั้งในรหัส ANSI C ฉันสามารถเห็นวงเล็บล้อมรอบค่าที่ส่งคืนเดียว
แบบนี้:-
int foo(int x) {
if (x)
return (-1);
else
return (0);
}
เหตุใดจึงใช้ () รอบค่าส่งคืนในกรณีเหล่านั้น มีความคิดอะไรบ้าง? ฉันไม่เห็นเหตุผลสำหรับเรื่องนั้น
ไม่มีเหตุผลจริงๆ...มันเป็นเพียงธรรมเนียมเก่าๆ
เพื่อประหยัดพื้นที่ โปรแกรมเมอร์มักจะคำนวณขั้นสุดท้ายในบรรทัดส่งคืน แทนที่จะคำนวณในบรรทัดของตัวเอง และวงเล็บให้แน่ใจว่าส่วนใหญ่อยู่ที่นั่นเพื่อให้ง่ายต่อการเห็นว่าเป็นคำสั่งเดียวที่ถูกส่งคืน เช่นนี้:
return (x+i*2);
แทน
int y = x+i*2;
return y;
วงเล็บกลายเป็นนิสัยและติดขัด
return x+i*2;
สั้นกว่าเหรอ?
- person TonyK; 21.01.2011
if
et al หากฉันเป็นราชา) สำหรับ make it easier to see that it is a single statement that is returned
ประการแรก นั่นคือนิพจน์ ไม่ใช่คำสั่ง - และอะไรนะ ผู้คนคิดว่า return
เป็นตัวดำเนินการที่ละโมบ และ return x+i*2
อาจส่งคืน x
และละทิ้งส่วนที่เหลือ ถ้าเป็นเช่นนั้นว้าว หรือคำตอบนี้กำลังคิดถึงสำนวนยาว ๆ ที่อาจครอบคลุมหลายบรรทัดจริงๆ ไม่ว่าจะด้วยวิธีใด มันก็พลาดจุดของตัวเองโดยสิ้นเชิง
- person underscore_d; 31.07.2016
แรงจูงใจที่ใช้งานได้จริงแต่ไม่น่าจะเป็นไปได้คือ ถ้าคุณใส่วงเล็บล้อมรอบค่า คุณสามารถกำหนดให้ return เป็นมาโคร จากนั้นใส่โค้ดบันทึกเพื่อดูการส่งคืนทั้งหมดของคุณ
สไตล์ส่วนตัวของฉันคือการใช้วงเล็บหากมีสำนวนที่ซับซ้อน เช่น.,
return (a + b);
แต่จะไม่ใช้มันหากสำนวนนั้นเป็นคำง่ายๆ
return a;
ฉันไม่สามารถพูดได้ว่าทำไมฉันถึงทำแบบนั้น เป็นเพียงสิ่งที่ฉันหยิบขึ้นมาเมื่อนานมาแล้ว
อย่างไรก็ตาม ฉันคิดว่าการทำให้ดูเหมือนเป็นการเรียกใช้ฟังก์ชัน เช่นนี้
return(a); // ugh
น่าเกลียดอย่างไม่น่าเชื่อและผิดเลย
return (a);
และ return a ;
- person ; 02.03.2014
ในข้อกำหนด C ดั้งเดิม ต้องใช้วงเล็บล้อมรอบค่าที่ส่งคืน . แม้ว่าคอมไพเลอร์ C สมัยใหม่และมาตรฐาน ANSI C จะไม่ต้องการสิ่งเหล่านั้น แต่การมีวงเล็บก็ไม่ส่งผลกระทบต่อค่าที่ส่งคืน และบางครั้งโปรแกรมเมอร์ก็ยังรวมพวกมันไว้จนติดเป็นนิสัย ไม่คุ้นเคยกับมาตรฐาน เพื่อให้สอดคล้องกับโวหาร แบบแผนที่ต้องการหรืออาจเป็นไปได้สำหรับความเข้ากันได้แบบย้อนหลัง
ฉันควรเพิ่มสำหรับผู้ที่กำลังคิดเกี่ยวกับ C++: คำถาม นี้ เกี่ยวกับ C และ C ไม่ใช่ C++; นี่เป็นสองภาษาที่แตกต่างกันซึ่งมีมาตรฐาน ความสามารถ ระดับความยาก และรูปแบบการใช้งานที่แตกต่างกันออกไป ไม่ว่าภาษาทั้งสองจะมีอะไรเหมือนกัน ก็ควรที่จะถือว่ามันเป็นสองสิ่งที่แยกจากกันโดยสิ้นเชิง สำหรับคำถามที่คล้ายกันซึ่งครอบคลุม C++ โปรดดู วงเล็บล้อมรอบผลลัพธ์มีนัยสำคัญในคำสั่ง return หรือไม่
มีเหตุผลบางประการ:
ถ้า / ในขณะที่ / สำหรับ / ฯลฯ เป็นคีย์เวิร์ดควบคุมทั้งหมดซึ่งต้องมีเครื่องหมายวงเล็บ ดังนั้นจึงมักดูเหมือนเป็นเรื่องธรรมดาที่จะนำพวกเขากลับมาด้วย
sizeof เป็นคำหลักเพียงคำเดียวที่สามารถมีได้หรือไม่ก็ได้ ยกเว้นในบางกรณีคุณต้องใช้เครื่องหมายวงเล็บ ดังนั้นจึงง่ายกว่าที่จะสร้างนิสัยการใช้วงเล็บเสมอ สำหรับ sizeof ซึ่งแสดงถึงตรรกะของ: ถ้าทำได้ ให้ทำเสมอ
case/goto เป็นคีย์เวิร์ดเดียวที่คุณไม่เคยใช้เครื่องหมายวงเล็บ ... และผู้คนมักจะคิดว่าสิ่งเหล่านั้นเป็นกรณีพิเศษ (และชอบให้ทั้งคู่โดดเด่นจากคีย์เวิร์ดควบคุมอื่นๆ โดยเฉพาะ goto)
เมื่อส่งคืน -1 เหมือนกับตัวอย่างของคุณ ฉันคิดว่าวงเล็บจะอ่านง่ายกว่าเพราะเครื่องหมายลบจะมองเห็นได้ชัดเจนกว่า:
return 1
or
return -1
or
return (-1)
บางทีมันอาจจะกำหนดเองก็ได้ เพราะคนที่นำ Unix และ C มาให้เรานั้นมาจากโปรเจ็กต์ Multics Multics เขียนด้วย PL/I และใน PL/I ต้องมีวงเล็บ
ฉันเคยร่วมงานกับโปรแกรมเมอร์อย่างน้อยหนึ่งคนที่คิดว่า return คือ การเรียกใช้ฟังก์ชันประเภทพิเศษ และต้องประหลาดใจเมื่อเขาเห็นว่าโค้ดของฉันเป็นไปตามข้อกำหนดโดยไม่มีวงเล็บ
บ่อยครั้งเมื่อใช้วงเล็บ ฉันคิดว่านั่นเป็นเพียงเพื่อให้อ่านง่าย (เช่น Ruby รองรับการเรียกเมธอดโดยไม่มีวงเล็บปิดล้อมอาร์กิวเมนต์ แต่หนังสือและบทความล่าสุดแนะนำเป็นอย่างอื่น)
วงเล็บในคำสั่ง return ระบุให้คอมไพเลอร์ทราบว่าคุณต้องการส่งคืนค่านี้ในสแต็กแทนที่จะส่งกลับในหน่วยความจำ
ในสมัยก่อนมีการบังคับใช้อย่างเข้มงวด (โดยทั่วไป) แต่ปัจจุบันผู้รวบรวมส่วนใหญ่มองว่าเป็นเพียงคำใบ้เท่านั้น
นี่คือสิ่งที่ฉันทำบ่อยๆ เนื่องจากข้อผิดพลาดอาจทำให้สิ่งใดก็ตามที่ส่งคืนผ่านการอ้างอิงหน่วยความจำเสียหาย แต่โดยทั่วไปแล้วจะไม่ส่งผลต่อตัวแปรที่ส่งคืนบนสแต็ก
การใช้สแต็กสำหรับตัวแปรชั่วคราวยังช่วยลดการใช้หน่วยความจำ และโดยทั่วไปจะทำให้การเรียกใช้ฟังก์ชัน/การส่งคืนเร็วขึ้น เนื่องจากนั่นคือสิ่งที่สแต็กได้รับการออกแบบมา สำหรับข้อมูล/ตัวแปรชั่วคราว
การใช้วงเล็บในคำสั่ง return แสดงว่าไวยากรณ์ C/C++
มีไม่เพียงพอ มันง่ายอย่างนั้น แต่ก็ไม่ได้แย่เท่ากับการใส่ทุกอย่างไว้ในเครื่องหมายปีกกา:
int foo(int x) {
if (x) {
return (-1);
}
else {
return (0);
}
}
โปรแกรมเมอร์จำนวนมากทำเช่นนี้ หากใครคนหนึ่งได้อ่านข้อความนี้ บางทีคุณอาจต้องการอธิบาย