ข้อใดต่อไปนี้เกี่ยวกับฟังก์ชั่นที่ไม่ถูกต้อง


17

ดังนั้นในขณะที่ฉันทำการคอมไพล์ที่มีความยาวฉันตัดสินใจที่จะทำการทดสอบทั่วไป C ++ บน ODesk และเจอคำถามนี้

คำถามนี้

ถ้าฉันไม่ผิดให้ถ้อยคำ (หรือขาดมัน) สิ่งเหล่านี้อาจเป็นจริง

a.

int Foo() { }
int Foo(int bar) { }

ดีreturn void;จะไม่ถูกต้องความหมาย แต่ฟังก์ชั่นอย่างเห็นได้ชัดสามารถมีvoidประเภทผลตอบแทน

void Foo() { }

ค. นี่คือนิยามของฟังก์ชั่นอินไลน์ใช่

d โดยไม่ต้องลงรายละเอียดมากเกี่ยวกับการจัดวางองค์ประกอบต่อไปนี้

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

นอกจากนี้คุณก็สามารถทำได้โดยใช้lambdas และ functors

อี

void Foo(int& bar)
{
    ++bar;
}

int foobar = 5;
Foo(foobar);

int bar = 5;

int& GetBar()
{
    return bar;
}

GetBar() = 6;

ก.

int bar = 5;

int* GetBar()
{
    return &bar;
}

(*GetBar()) = 5;

ฉันไม่สามารถดูได้ว่าคำถามนี้มีคำตอบที่ผิดใด ๆ หรือไม่ ฉันพลาดอะไรไปรึเปล่า?

ไม่จำเป็นต้องบอกว่าฉันหมดเวลาและล้มเหลวทุกอย่าง ฉันเดาว่าฉันเป็นโปรแกรมเมอร์ C ++ ที่ไม่ดี :(


18
มาที่นี่เพื่อตะโกนใส่เด็กทำการบ้านรู้สึกประหลาดใจ
ลูกแมวบางคน

จริงๆแล้วไม่ใช่ทุกภาษาที่ต้องการฟังก์ชั่นอินไลน์ที่จะขยาย "อินไลน์" เป็นคำใบ้คอมไพเลอร์มากกว่าคำสั่งใน Delphi และ C, C ++ มีข้อยกเว้น ดังนั้น "c" อาจเป็นเท็จได้เช่นกัน มันอาจจะเป็นความบันเทิงมากขึ้นในการเขียนคำตอบที่แสดงว่าแต่ละคำสั่งอาจผิด
Móż

1
@ Ӎσᶎหากมีเพียงกล่องข้อความ ฉันต้องการย้อนกลับไปและกด "รายงานปัญหาเกี่ยวกับคำถามนี้"
Qix

5
นั่นไม่ใช่ฟังก์ชั่นมากมาย นั่นคืออาเรย์ของพอยน์เตอร์ของฟังก์ชัน
user253751

@immibis จริง แต่คำถามไม่ได้ชี้แจงจริง ๆ (อย่างน้อยสำหรับฉันมันไม่ได้)
Qix

คำตอบ:


21

คำถามทั้งหมดนี้หลบไปเลย คำแถลงคำถามแสดงถึงความเป็นไปได้ของตัวเลือกหลายตัวในขณะที่ปุ่มตัวเลือกระบุตัวเลือกเดียว

ยิ่งกว่านั้น b ค่อนข้างน่าสงสัยเนื่องจากฟังก์ชั่นโมฆะไม่ส่งคืนอะไร

D ยังเป็นที่สงสัยเช่นกันเพราะเท่าที่ฉันรู้คุณไม่สามารถใช้ฟังก์ชันต่างๆได้ แน่นอนว่าคุณสามารถมีพอยน์เตอร์ของฟังก์ชันมากมาย แต่นั่นไม่เหมือนกันทั้งหมด


ขวา; D intเป็นเช่นถามว่าคุณสามารถเรียก แน่นอนว่าถ้าคุณทิ้งให้ตัวชี้และตัวชี้ที่หมายถึงฟังก์ชั่น ...
Qix

1
ฉันยินดีที่จะเดิมพัน D คือคำตอบที่พวกเขากำลังทำอยู่ แต่ใช่คำถามนั้นไม่ดี
Gort the Robot

ในขณะที่voidฟังก์ชั่นไม่ได้กลับใด ๆค่าพวกเขายังคงกลับประเภท voidดังนั้นฉันบอกว่า B เป็นจริง
Thomas Eding

@ThomasEding ยังมีถ้อยคำที่ไม่ดีในส่วนของพวกเขา คุณทำไม่ได้แต่return void; return;
Qix

10

คำตอบ c) เป็นเท็จด้วยเช่นกัน

"ฟังก์ชั่นอินไลน์ถูกขยายในช่วงเวลาคอมไพล์เพื่อหลีกเลี่ยงค่าใช้จ่ายในการร้องขอ"

ประการแรกคอมไพเลอร์ C ++ ได้รับอนุญาตให้ละเว้นinlineคำใบ้โดยไม่ขยายฟังก์ชั่นเลย

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


คุณถูกต้อง แต่ฉันคิดเกี่ยวกับมันในแง่ของ'โอเคคอมไพเลอร์ได้พิจารณาแล้วว่ามันไม่ต้องการอินไลน์ฟังก์ชั่น'มากกว่าinlineคำใบ้
Qix

คอมไพเลอร์ไม่สามารถละเลยคำใบ้ได้อย่างสมบูรณ์ อย่างน้อยก็เป็นเอฟเฟ็กต์ที่ต้องทำ
Deduplicator

@Dupuplicator - สามารถทำได้ "ไม่ว่าคุณจะกำหนดฟังก์ชั่นเป็นอินไลน์มันเป็นคำขอที่คอมไพเลอร์ได้รับอนุญาตให้ละเว้น: คอมไพเลอร์อาจขยายอินไลน์บางส่วน, ทั้งหมดหรือไม่มีตำแหน่งที่คุณเรียกฟังก์ชั่นที่กำหนดเป็นอินไลน์" - source isocpp.org/wiki/faq/Inline-Functions
Stephen C

@StephenC: ไม่สามารถเพิกเฉยต่อคำขออินไลน์ได้ ฉันแค่บอกว่าข้อยกเว้นที่ชัดเจนของ ODR ไม่สามารถทำได้
Deduplicator

ฉันเห็น. ฉันได้อัปเดตข้อความของคำตอบแล้ว
Stephen C

7

ค. นี่คือนิยามของฟังก์ชั่นอินไลน์ใช่

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

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

d โดยไม่ต้องลงรายละเอียดมากเกี่ยวกับการจัดวางองค์ประกอบต่อไปนี้

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

นอกจากนี้คุณสามารถทำได้โดยใช้ lambdas และ functors

ในตัวอย่างของคุณfunctionsคืออาร์เรย์ของพอยน์เตอร์ฟังก์ชันและไม่ใช่อาร์เรย์ของฟังก์ชันเอง ในทำนองเดียวกัน lambdas และ functors ก็ไม่ได้ทำหน้าที่เหมือนกัน พวกเขาเป็นคลาสที่ตอบสนองต่อตัวดำเนินการเรียกฟังก์ชัน แต่นั่นไม่ได้ทำให้พวกเขาทำงานในสายตาของคำนิยามภาษา C ++

ฟังก์ชั่นใน C ++ นั้นเป็นเหมือนพลเมืองชั้นสอง คุณสามารถกำหนดและเรียกพวกมันได้ แต่ทันทีที่คุณลองทำอย่างอื่นด้วยประเภทฟังก์ชั่น (เช่นสร้างอาร์เรย์ของพวกมัน) คุณจะได้รับข้อผิดพลาดหรือพวกมันจะแปลงตัวเองเป็นตัวชี้อย่างเงียบ ๆ


ฉันเห็นด้วยกับ D บิต แต่ฉันอ่านcว่าเป็นฟังก์ชั่นที่มีการทำเครื่องหมายเชิงบวกสำหรับการทำอินไลน์แล้วกับinlineคำหลักนั้นเอง ฉันเข้าใจว่าinlineเป็นคำใบ้
Qix

4

ถ้ามีอะไรมันจะต้องเป็น . คุณไม่สามารถแต่คุณสามารถกลับมาเป็น ความว่างเปล่าในการประกาศฟังก์ชั่นควรอยู่ที่นั่นเพื่อแจ้งให้ผู้รวบรวมทราบถึงการขาดค่าส่งคืนreturnvoidnull

ประเภทโมฆะ

ใน C และ C ++

ฟังก์ชั่นที่มีประเภทผลลัพธ์เป็นโมฆะสิ้นสุดลงอย่างใดอย่างหนึ่งโดยถึงจุดสิ้นสุดของฟังก์ชั่นหรือโดยการดำเนินการคำสั่งกลับมาโดยไม่มีค่าตอบแทน ประเภทโมฆะอาจปรากฏขึ้นเป็นอาร์กิวเมนต์เพียงอย่างเดียวของต้นแบบฟังก์ชั่นเพื่อบ่งชี้ว่าฟังก์ชั่นจะไม่มีข้อโต้แย้ง โปรดทราบว่าแม้จะมีชื่อในทุกสถานการณ์เหล่านี้ประเภทโมฆะทำหน้าที่เป็นหน่วยประเภทไม่เป็นศูนย์หรือประเภทด้านล่างแม้ว่าจะแตกต่างจากประเภทหน่วยจริงซึ่งเป็นซิงเกิลตันประเภทโมฆะกล่าวว่าจะประกอบด้วยที่ว่างเปล่า ชุดของค่าและภาษาไม่ได้ให้วิธีการประกาศวัตถุใด ๆ หรือเป็นตัวแทนของค่าที่มีประเภทเป็นโมฆะ


2
-1: ในขณะที่voidฟังก์ชั่นไม่ได้กลับใด ๆค่าพวกเขายังคงกลับประเภท voidดังนั้นฉันบอกว่า B เป็นจริง
Thomas Eding

อนุญาตให้มีการย้อนกลับเป็นโมฆะในบางสถานการณ์ ดูที่นี่
Josh Kelley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.