วงเล็บล้อมรอบค่าที่ส่งคืนใน C

บ่อยครั้งในรหัส ANSI C ฉันสามารถเห็นวงเล็บล้อมรอบค่าที่ส่งคืนเดียว

แบบนี้:-

int foo(int x) {
  if (x)
    return (-1);
  else
    return (0);
}

เหตุใดจึงใช้ () รอบค่าส่งคืนในกรณีเหล่านั้น มีความคิดอะไรบ้าง? ฉันไม่เห็นเหตุผลสำหรับเรื่องนั้น


person Tooony    schedule 02.10.2008    source แหล่งที่มา
comment
ดูเหมือนว่าเป็นการเรียกใช้ฟังก์ชันแบบนั้น ;-)   -  person Toon Krijthe    schedule 02.10.2008
comment
แต่การ return ไม่ใช่การเรียกใช้ฟังก์ชัน เว้นแต่คุณจะเป็น Schemer :-ป   -  person Chris Jester-Young    schedule 02.10.2008
comment
Tooony: ฉันอยากรู้ว่าทำไมคนถึงใส่วงเล็บที่ไม่จำเป็นสำหรับ sizeof เหมือนกัน!   -  person Chris Jester-Young    schedule 02.10.2008
comment
แม้ว่าจะมีการเสนอเหตุผลตามหลักสรีรศาสตร์เฉพาะกิจสำหรับนิสัยนี้ แต่ก็คุ้มค่าที่จะดูภาษาสมัยใหม่ที่มีข้อความตอบกลับและถามว่ามีแบบแผนเดียวกันหรือไม่ AFAIK คำตอบคือไม่ดังกึกก้อง คำตอบของ User10392 นั้นน่าสนใจตรงที่มันให้ผลประโยชน์เฉพาะ C ที่ได้มาจากนิสัย   -  person AmigoNico    schedule 19.06.2013


คำตอบ (11)


ไม่มีเหตุผลจริงๆ...มันเป็นเพียงธรรมเนียมเก่าๆ

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

return (x+i*2);

แทน

int y = x+i*2;
return y;

วงเล็บกลายเป็นนิสัยและติดขัด

person Adam Haile    schedule 02.10.2008
comment
ฉันมักจะทำเมื่อฉันคืนคณิตศาสตร์แบบนั้น ฉันไม่รู้ มันเหมือนฉันกลัวว่าวิธีการจะกลับมาก่อนที่คณิตศาสตร์จะประเมินเสร็จหรืออะไรสักอย่าง o.O - person Wes P; 02.10.2008
comment
ดีใจที่ไม่ใช่แค่ฉันที่คิดว่ามันไม่จำเป็น ;-) วงเล็บสำหรับการตั้งค่าลำดับความสำคัญเป็นสิ่งที่เข้าใจได้ แต่ IMHO คำสั่ง return ดังข้างต้นควรแบ่งออกเป็นหลาย ๆ คำสั่ง เพิ่มความสามารถในการอ่านและมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยลง กล้าที่จะปฏิเสธสัญกรณ์ไส้กรอก! ;-) - person Tooony; 02.10.2008
comment
เพื่อประหยัดพื้นที่? กรุณาอธิบาย. แน่นอน return x+i*2; สั้นกว่าเหรอ? - person TonyK; 21.01.2011
comment
@TonyK - ว้าว... ฉันยอมรับว่าคำพูดไม่ชัดเจนหรือถูกต้องตามหลักไวยากรณ์ สิ่งที่ฉันหมายถึงคือการมีสองบรรทัด ... ฉันได้แก้ไขคำตอบแล้ว โปรดดูด้านบน - person Adam Haile; 21.01.2011
comment
วงเล็บให้แน่ใจว่าส่วนใหญ่อยู่ที่นั่นเพื่อให้ง่ายต่อการเห็นว่าเป็นคำสั่งเดียวที่ส่งคืน - สิ่งนี้หมายความว่าอย่างไร นอกเหนือจากไวยากรณ์แล้ว คุณไม่สามารถส่งคืนคำสั่งได้ และใช้พื้นที่มากกว่าที่ไม่มีวงเล็บ - person Remember Monica; 17.10.2014
comment
ขออภัยที่รื้อฟื้นคำตอบเก่า ๆ ดังกล่าว แต่จริงๆ แล้ว คือ เหตุผล ในช่วงแรกๆ ของภาษาซี ก่อนที่จะถูกทำให้เป็นมาตรฐาน ไวยากรณ์จำเป็นต้องมีวงเล็บ อ้างถึง cm.bell-labs.com/cm/cs/ ใคร/dmr/cman.ps. - person Segmented; 28.03.2015
comment
@MarcLehmann ฉันไม่รู้ว่ามันหมายถึงอะไรหรือได้รับการโหวตและยอมรับอย่างสูงได้อย่างไร การเพิ่มวงเล็บดูน่าเกลียดสำหรับฉัน (ฉันอาจกำจัดมันออกไปด้วยซ้ำ 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 เป็นมาโคร จากนั้นใส่โค้ดบันทึกเพื่อดูการส่งคืนทั้งหมดของคุณ

person user10392    schedule 02.10.2008
comment
ว้าว! ไม่น่าจะเป็นไปได้ แต่นี่เป็นแรงจูงใจเดียวที่ฉันเคยได้ยินมาสำหรับนิสัยที่ไม่เข้าท่า เอาล่ะ บางคนอาจคิดว่ามันอาจดูดีขึ้นหรือสม่ำเสมอกว่านี้ ไม่มีสิ่งใดที่เคยดูน่าสนใจแม้แต่น้อยด้วยซ้ำ ฉัน. ขอบคุณสำหรับความมีสติเล็กๆ น้อยๆ นี้!! - person AmigoNico; 19.06.2013
comment
ข้อสังเกตที่น่าสนใจ ในการทดลองของฉัน ฉันสังเกตเห็นว่ามาโครที่กำหนดสำหรับ return ดูเหมือนจะอนุญาตให้มีการโต้แย้งของแมโครโดยไม่มีวงเล็บ แต่มาโครที่กำหนดสำหรับชื่ออื่น (เช่น square) ไม่อนุญาต ฉันคิดว่าฉันได้จ้องมองไปที่เหวในครั้งนี้ ... - person Alain O'Dea; 29.08.2015
comment
... หวังว่าคงจะไม่มีใครเรียกใช้ฟังก์ชันหรือใช้ตัวดำเนินการเพิ่มหรือมีผลข้างเคียงอื่น ๆ ในคำสั่ง return - person Carl Norum; 29.09.2016
comment
นี่เป็นข้อโต้แย้งที่ชัดเจนที่จะไม่ใช้วงเล็บสำหรับคำสั่ง return - person nowox; 07.12.2017
comment
@CarlNorum คุณช่วยยกตัวอย่างง่ายๆ หน่อยได้ไหม? - person polynomial_donut; 19.09.2018
comment
@polynomial_donut - หากคุณมีนิพจน์ในคำสั่ง return ของคุณ ปัญหาปกติที่เกี่ยวข้องกับมาโคร เช่น การประเมินหลายครั้งอาจเกิดขึ้น - person Carl Norum; 19.09.2018

สไตล์ส่วนตัวของฉันคือการใช้วงเล็บหากมีสำนวนที่ซับซ้อน เช่น.,

return (a + b);

แต่จะไม่ใช้มันหากสำนวนนั้นเป็นคำง่ายๆ

return a;

ฉันไม่สามารถพูดได้ว่าทำไมฉันถึงทำแบบนั้น เป็นเพียงสิ่งที่ฉันหยิบขึ้นมาเมื่อนานมาแล้ว

อย่างไรก็ตาม ฉันคิดว่าการทำให้ดูเหมือนเป็นการเรียกใช้ฟังก์ชัน เช่นนี้

return(a);  // ugh

น่าเกลียดอย่างไม่น่าเชื่อและผิดเลย

person Kristopher Johnson    schedule 02.10.2008
comment
และเชิงอัตนัย - ฉันคิดว่าพื้นที่นั้นดูแย่ลง (ซึ่งเป็นอัตนัยที่เท่าเทียมกันแต่ตรงกันข้าม) - person Jonathan Leffler; 03.10.2008
comment
และมี return (a); และ return a ; - person ; 02.03.2014

ในข้อกำหนด C ดั้งเดิม ต้องใช้วงเล็บล้อมรอบค่าที่ส่งคืน . แม้ว่าคอมไพเลอร์ C สมัยใหม่และมาตรฐาน ANSI C จะไม่ต้องการสิ่งเหล่านั้น แต่การมีวงเล็บก็ไม่ส่งผลกระทบต่อค่าที่ส่งคืน และบางครั้งโปรแกรมเมอร์ก็ยังรวมพวกมันไว้จนติดเป็นนิสัย ไม่คุ้นเคยกับมาตรฐาน เพื่อให้สอดคล้องกับโวหาร แบบแผนที่ต้องการหรืออาจเป็นไปได้สำหรับความเข้ากันได้แบบย้อนหลัง

ฉันควรเพิ่มสำหรับผู้ที่กำลังคิดเกี่ยวกับ C++: คำถาม นี้ เกี่ยวกับ C และ C ไม่ใช่ C++; นี่เป็นสองภาษาที่แตกต่างกันซึ่งมีมาตรฐาน ความสามารถ ระดับความยาก และรูปแบบการใช้งานที่แตกต่างกันออกไป ไม่ว่าภาษาทั้งสองจะมีอะไรเหมือนกัน ก็ควรที่จะถือว่ามันเป็นสองสิ่งที่แยกจากกันโดยสิ้นเชิง สำหรับคำถามที่คล้ายกันซึ่งครอบคลุม C++ โปรดดู วงเล็บล้อมรอบผลลัพธ์มีนัยสำคัญในคำสั่ง return หรือไม่

person rakslice    schedule 21.10.2017
comment
IMHO นี่เป็นคำตอบเดียวที่สมเหตุสมผล / น่าเชื่อถือ (เนื่องจากอธิบายว่านิสัยแปลก ๆ อาจมาจากไหน) ฉันมาที่นี่จาก ดังนั้น: วงเล็บรอบผลลัพธ์มีนัยสำคัญในคำสั่ง return หรือไม่ เพิ่งได้เรียนรู้ความแตกต่างที่สำคัญอีกประการระหว่าง C และ ซี++... - person Scheff's Cat; 24.04.2019

มีเหตุผลบางประการ:

  1. ถ้า / ในขณะที่ / สำหรับ / ฯลฯ เป็นคีย์เวิร์ดควบคุมทั้งหมดซึ่งต้องมีเครื่องหมายวงเล็บ ดังนั้นจึงมักดูเหมือนเป็นเรื่องธรรมดาที่จะนำพวกเขากลับมาด้วย

  2. sizeof เป็นคำหลักเพียงคำเดียวที่สามารถมีได้หรือไม่ก็ได้ ยกเว้นในบางกรณีคุณต้องใช้เครื่องหมายวงเล็บ ดังนั้นจึงง่ายกว่าที่จะสร้างนิสัยการใช้วงเล็บเสมอ สำหรับ sizeof ซึ่งแสดงถึงตรรกะของ: ถ้าทำได้ ให้ทำเสมอ

  3. case/goto เป็นคีย์เวิร์ดเดียวที่คุณไม่เคยใช้เครื่องหมายวงเล็บ ... และผู้คนมักจะคิดว่าสิ่งเหล่านั้นเป็นกรณีพิเศษ (และชอบให้ทั้งคู่โดดเด่นจากคีย์เวิร์ดควบคุมอื่นๆ โดยเฉพาะ goto)

person James Antill    schedule 02.10.2008

เมื่อส่งคืน -1 เหมือนกับตัวอย่างของคุณ ฉันคิดว่าวงเล็บจะอ่านง่ายกว่าเพราะเครื่องหมายลบจะมองเห็นได้ชัดเจนกว่า:

return 1

or

return -1

or

return (-1)
person Stein G. Strindhaug    schedule 08.10.2008

บางทีมันอาจจะกำหนดเองก็ได้ เพราะคนที่นำ Unix และ C มาให้เรานั้นมาจากโปรเจ็กต์ Multics Multics เขียนด้วย PL/I และใน PL/I ต้องมีวงเล็บ

person James Jones    schedule 25.04.2014

ฉันเคยร่วมงานกับโปรแกรมเมอร์อย่างน้อยหนึ่งคนที่คิดว่า return คือ การเรียกใช้ฟังก์ชันประเภทพิเศษ และต้องประหลาดใจเมื่อเขาเห็นว่าโค้ดของฉันเป็นไปตามข้อกำหนดโดยไม่มีวงเล็บ

person AShelly    schedule 02.10.2008
comment
และในสมัยก่อน ในบางบริบท มันถูกนำไปใช้โดยฟังก์ชันที่ค่อนข้างแปลก นั่นคือ cret ในระดับแอสเซมเบลอร์ นี่เป็นข้อความที่กว้างขวาง ฉันควรหาแหล่งอ้างอิง มันอยู่ในหนังสือ XINU ของ Comer ซึ่งคุณสามารถค้นหาได้จากการค้นหาโดย Google ที่มหาวิทยาลัย Purdue - person Jonathan Leffler; 03.10.2008

บ่อยครั้งเมื่อใช้วงเล็บ ฉันคิดว่านั่นเป็นเพียงเพื่อให้อ่านง่าย (เช่น Ruby รองรับการเรียกเมธอดโดยไม่มีวงเล็บปิดล้อมอาร์กิวเมนต์ แต่หนังสือและบทความล่าสุดแนะนำเป็นอย่างอื่น)

person Manrico Corazzi    schedule 02.10.2008

วงเล็บในคำสั่ง return ระบุให้คอมไพเลอร์ทราบว่าคุณต้องการส่งคืนค่านี้ในสแต็กแทนที่จะส่งกลับในหน่วยความจำ

ในสมัยก่อนมีการบังคับใช้อย่างเข้มงวด (โดยทั่วไป) แต่ปัจจุบันผู้รวบรวมส่วนใหญ่มองว่าเป็นเพียงคำใบ้เท่านั้น

นี่คือสิ่งที่ฉันทำบ่อยๆ เนื่องจากข้อผิดพลาดอาจทำให้สิ่งใดก็ตามที่ส่งคืนผ่านการอ้างอิงหน่วยความจำเสียหาย แต่โดยทั่วไปแล้วจะไม่ส่งผลต่อตัวแปรที่ส่งคืนบนสแต็ก

การใช้สแต็กสำหรับตัวแปรชั่วคราวยังช่วยลดการใช้หน่วยความจำ และโดยทั่วไปจะทำให้การเรียกใช้ฟังก์ชัน/การส่งคืนเร็วขึ้น เนื่องจากนั่นคือสิ่งที่สแต็กได้รับการออกแบบมา สำหรับข้อมูล/ตัวแปรชั่วคราว

person Diogenes    schedule 26.03.2016
comment
หากมีคอมไพเลอร์ที่ทำสิ่งนี้จริง ๆ คงจะดีถ้าแสดงตัวอย่างแอสเซมบลีที่สร้างโดยคอมไพเลอร์สำหรับแต่ละกรณี - person rakslice; 29.06.2018

การใช้วงเล็บในคำสั่ง return แสดงว่าไวยากรณ์ C/C++ มีไม่เพียงพอ มันง่ายอย่างนั้น แต่ก็ไม่ได้แย่เท่ากับการใส่ทุกอย่างไว้ในเครื่องหมายปีกกา:

int foo(int x) {
  if (x) {
    return (-1);
  }
  else {
    return (0);
  }
}

โปรแกรมเมอร์จำนวนมากทำเช่นนี้ หากใครคนหนึ่งได้อ่านข้อความนี้ บางทีคุณอาจต้องการอธิบาย

person TonyK    schedule 21.01.2011
comment
โดยปกติแล้ว วงเล็บปีกกาจะใช้เพื่อลดโอกาสที่จะเกิดข้อผิดพลาดในการแก้ไขโค้ดในอนาคต คำตอบแรกสำหรับคำถามนี้ให้ตัวอย่าง: programmers.stackexchange.com/questions/16528/ - person Mike Pelley; 25.08.2011
comment
นอกจากนี้ การใช้เครื่องหมายปีกกาเสมอจะทำให้โค้ดผสานได้ง่ายยิ่งขึ้นโดยอัตโนมัติ มิฉะนั้น คุณมีแนวโน้มที่จะได้รับข้อขัดแย้งที่ต้องจัดการด้วยตนเองมากขึ้น - person hlovdal; 14.12.2012
comment
มีข้อบกพร่องมากมายที่เกิดขึ้นเนื่องจากไม่มีเครื่องหมายปีกกา ฉันยอมรับว่ามันน่าเกลียดสำหรับหนึ่งบรรทัด แต่เมื่อคุณแทนที่การเรียกใช้ฟังก์ชันด้วยมาโคร - เนื่องจากบางครั้งมันเกิดขึ้นเนื่องจากข้อจำกัดพิเศษ - หรือเมื่อโปรแกรมถูกปรับโครงสร้างใหม่เพื่อแทนที่นิพจน์บรรทัดเดียวด้วยชุดนิพจน์ที่ยาวกว่า ข้อบกพร่องอาจไม่ ปรากฏให้เห็นทันทีและเกิดขึ้นเฉพาะในกรณีพิเศษที่ไม่สามารถทดสอบได้โดยอัตโนมัติเท่านั้น วงเล็บปีกกายังเป็นข้อกำหนดที่ต้องฮาร์ดโค้ดในบางบริษัท (ฉันมีที่บริษัทรับเหมาทางทหาร) แม้กระทั่งสำหรับ 1 สมุทร - person Coyote; 10.05.2013
comment
MISRA ห้ามมิให้ถอดเหล็กจัดฟันส่วนเกินออกอย่างชัดเจน - person Toby; 08.07.2015