คำถามติดแท็ก c++

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

3
ทำไมต้องใช้“ b <a? a: b” แทนที่จะเป็น“ a <b? b: a” เพื่อสร้างเทมเพลตสูงสุด?
เทมเพลต C ++ - คู่มือฉบับสมบูรณ์ฉบับที่ 2แนะนำเทมเพลตสูงสุด : template&lt;typename T&gt; T max (T a, T b) { // if b &lt; a then yield a else yield b return b &lt; a ? a : b; } และมันอธิบายการใช้“b &lt; a ? a : b”แทน“a &lt; b ? b : a”: โปรดทราบว่าเทมเพลตสูงสุด …
154 c++  templates 

12
ทำไมเราต้องมี destructor เสมือนแท้ใน C ++
ฉันเข้าใจถึงความต้องการตัวทำลายล้างเสมือนจริง แต่ทำไมเราต้องมี destructor เสมือนแท้? ในหนึ่งในบทความ C ++ ผู้เขียนได้กล่าวว่าเราใช้ destructor เสมือนจริงเมื่อเราต้องการสร้างบทคัดย่อของคลาส แต่เราสามารถสร้างคลาสนามธรรมโดยการทำให้ฟังก์ชั่นสมาชิกใด ๆ เสมือนเสมือนจริง ดังนั้นคำถามของฉันคือ เมื่อไหร่ที่เราจะสร้างผู้ทำลายล้างเสมือนจริง? ใครสามารถยกตัวอย่างเรียลไทม์ได้บ้าง? เมื่อเราสร้างคลาสนามธรรมมันเป็นวิธีปฏิบัติที่ดีที่จะทำให้ destructor นั้นเสมือนจริงหรือไม่? ถ้าใช่ .. แล้วทำไมล่ะ

20
ในขณะที่ (1) สำหรับ (;;) มีความแตกต่างความเร็วหรือไม่
รุ่นยาว ... เพื่อนร่วมงานยืนยันในวันนี้หลังจากเห็นการใช้งานของฉันwhile (1)ในสคริปต์ Perl ที่for (;;)เร็วขึ้น ฉันแย้งว่าพวกเขาควรจะเหมือนกันโดยหวังว่าล่ามจะปรับความแตกต่างให้เหมาะสม ฉันตั้งค่าสคริปต์ที่จะเรียกใช้ 1,000,000,000 สำหรับการวนซ้ำวนซ้ำและในขณะเดียวกันก็วนซ้ำและบันทึกเวลาระหว่างกัน ฉันไม่พบความแตกต่างที่เห็นคุณค่า เพื่อนร่วมงานของฉันบอกว่าศาสตราจารย์คนหนึ่งบอกเขาว่าการwhile (1)เปรียบเทียบกำลังดำเนินการอยู่1 == 1และfor (;;)ไม่ใช่ เราทำการทดสอบซ้ำกับ 100x จำนวนการวนซ้ำด้วย C ++ และความแตกต่างนั้นเล็กน้อย อย่างไรก็ตามเป็นตัวอย่างที่แสดงให้เห็นว่าโค้ดที่คอมไพล์ได้เร็วขึ้นสามารถเทียบกับภาษาสคริปต์ได้ เวอร์ชั่นสั้น... มีเหตุผลใดที่จะชอบwhile (1)มากกว่าfor (;;)ถ้าคุณต้องการวงวนไม่สิ้นสุดเพื่อแยกออกจากกัน? หมายเหตุ:หากยังไม่ชัดเจนจากคำถาม นี่เป็นการสนทนาทางวิชาการที่สนุกสนานระหว่างเพื่อนสองคน ฉันรู้ว่านี่ไม่ใช่แนวคิดที่สำคัญอย่างยิ่งที่โปรแกรมเมอร์ทุกคนควรทนทุกข์ทรมาน ขอบคุณสำหรับคำตอบที่ดีทั้งหมดที่ฉัน (และฉันแน่ใจว่าคนอื่น ๆ ) ได้เรียนรู้เล็ก ๆ น้อย ๆ จากการสนทนานี้ ปรับปรุง:เพื่อนร่วมงานดังกล่าวชั่งน้ำหนักด้วยคำตอบด้านล่าง อ้างถึงที่นี่ในกรณีที่ถูกฝังอยู่ มันมาจากโปรแกรมเมอร์แอสเซมบลีของ AMD เขาระบุว่าโปรแกรมเมอร์ C (ผู้ประพันธ์) ไม่ทราบว่ารหัสของพวกเขาไม่มีประสิทธิภาพ เขากล่าวในวันนี้ว่าคอมไพเลอร์ gcc …

7
สถาปัตยกรรมที่แปลกใหม่ที่คณะกรรมการมาตรฐานใส่ใจ
ฉันรู้ว่ามาตรฐาน C และ C ++ ออกจากแง่มุมต่าง ๆ ของการใช้งานภาษาที่กำหนดเพราะถ้ามีสถาปัตยกรรมที่มีคุณสมบัติอื่น ๆ มันจะยากมากหรือเป็นไปไม่ได้ที่จะเขียนคอมไพเลอร์ที่สอดคล้องกับมาตรฐาน ฉันรู้ว่า 40 ปีที่แล้วคอมพิวเตอร์เครื่องใดมีคุณสมบัติเฉพาะของตัวเอง อย่างไรก็ตามฉันไม่รู้สถาปัตยกรรมที่ใช้ในปัจจุบันที่: CHAR_BIT != 8 signed ไม่ใช่สองส่วน (ฉันได้ยินว่า Java มีปัญหากับอันนี้) จุดลอยตัวไม่เป็นไปตามมาตรฐาน IEEE 754 (แก้ไข: ฉันหมายถึง "ไม่ได้อยู่ในการเข้ารหัสแบบไบนารีของ IEEE 754") เหตุผลที่ฉันขอคือว่าผมมักจะอธิบายให้คนที่เป็นของดีที่ C ++ ไม่อาณัติด้านระดับต่ำอื่น ๆ เช่นประเภทขนาดคง† มันดีเพราะไม่เหมือน 'ภาษาอื่น ๆ ' เพราะมันทำให้โค้ดของคุณพกพาได้เมื่อใช้อย่างถูกต้อง (แก้ไข: เนื่องจากมันสามารถย้ายไปยังสถาปัตยกรรมอื่น ๆ ได้โดยไม่ต้องจำลองด้านต่ำของเครื่องเช่นเช่นเลขคณิตสองส่วนของเครื่องหมาย + สถาปัตยกรรมขนาด) . แต่ฉันรู้สึกแย่ที่ฉันไม่สามารถชี้ไปที่สถาปัตยกรรมเฉพาะได้ด้วยตัวเอง ดังนั้นคำถามคือสถาปัตยกรรมใดที่แสดงคุณสมบัติข้างต้น …
154 c++  c  architecture 

11
C ++ ไม่สนับสนุนการแปลงจากค่าคงที่สตริงเป็น 'char *'
ฉันมีชั้นเรียนด้วย private char str[256]; และสำหรับฉันมีตัวสร้างที่ชัดเจน: explicit myClass(const char *func) { strcpy(str,func); } ฉันเรียกมันว่า: myClass obj("example"); เมื่อฉันรวบรวมสิ่งนี้ฉันจะได้รับคำเตือนต่อไปนี้: การแปลงที่เลิกใช้แล้วจากค่าคงที่สตริงเป็น 'char *' ทำไมสิ่งนี้จึงเกิดขึ้น

13
อะไรคือความแตกต่างระหว่างชนิด“ ทั่วไป” ใน C ++ และ Java
Java มี generics และ C ++ ให้รูปแบบการเขียนโปรแกรมที่แข็งแกร่งมากกับtemplates ดังนั้นอะไรคือความแตกต่างระหว่าง C ++ และ Java generics?

5
ตรวจสอบว่ามีโฟลเดอร์อยู่ (และสร้างโฟลเดอร์) ใน Qt, C ++
ใน Qt ฉันจะตรวจสอบว่ามีโฟลเดอร์ที่กำหนดอยู่ในไดเรกทอรีปัจจุบันได้อย่างไร? หากไม่มีอยู่ฉันจะสร้างโฟลเดอร์ว่างได้อย่างไร
153 c++  qt  filesystems 

4
“ long long” =“ long long int” =“ long int ยาว” =“ int long long” หรือไม่
ฉันพบทั้งสองlong int longและint long longสามารถรวบรวมสำหรับประเภทตัวแปร มีความแตกต่างระหว่างlong int long, int long long, long longและlong long int? โดยทั่วไปแล้วประเภทจะเหมือนกันหากมีจำนวนเท่ากันlong? 1 ยาว: long l; int long il; long int li; 2 ยาว: long long ll; int long long ill; long int long lil; long long int lli; และถ้าด้านบนถูกต้องการประกาศต่อไปนี้เหมือนกันหรือไม่ long long* llp; int long long* …
153 c++  syntax  long-integer 

4
การดำเนินการ "false <true" ถูกกำหนดอย่างดีหรือไม่
ข้อกำหนด C ++ กำหนดไว้หรือไม่: การมีอยู่ของตัวดำเนินการ 'น้อยกว่า' สำหรับพารามิเตอร์บูลีนและหากเป็นเช่นนั้น ผลลัพธ์ของการเปลี่ยนลำดับพารามิเตอร์ 4 รายการคืออะไร? กล่าวอีกนัยหนึ่งผลลัพธ์จากการดำเนินการต่อไปนี้ถูกกำหนดโดยสเปคหรือไม่ false &lt; false false &lt; true true &lt; false true &lt; true ในการตั้งค่าของฉัน (Centos 7, gcc 4.8.2) โค้ดด้านล่างจะแยกแยะสิ่งที่ฉันคาดหวัง (จากประวัติของ C ในการแทน false เป็น 0 และ true เป็น 1): false &lt; false = false false &lt; true = true true …

8
ปรับแต่ง“ ในขณะที่ (1);” ใน C ++ 0x
อัปเดตดูด้านล่าง! ฉันเคยได้ยินและอ่านว่า C ++ 0x อนุญาตให้คอมไพเลอร์พิมพ์ "Hello" สำหรับตัวอย่างต่อไปนี้ #include &lt;iostream&gt; int main() { while(1) ; std::cout &lt;&lt; "Hello" &lt;&lt; std::endl; } เห็นได้ชัดว่ามีบางอย่างเกี่ยวข้องกับเธรดและความสามารถในการปรับให้เหมาะสม ฉันคิดว่ามันน่าแปลกใจที่หลาย ๆ คนคิดว่า บางคนมีคำอธิบายที่ดีว่าเหตุใดจึงจำเป็นต้องอนุญาต สำหรับการอ้างอิง C ++ 0x ฉบับร่างล่าสุดระบุไว้ที่6.5/5 ลูปที่นอกเหนือจากคำสั่ง for-init ในกรณีของคำสั่ง for ไม่เรียกใช้ฟังก์ชันห้องสมุด I / O และ ไม่สามารถเข้าถึงหรือแก้ไขวัตถุที่ระเหยได้และ ไม่มีการดำเนินการซิงโครไนซ์ (1.10) หรือการดำเนินการปรมาณู (ข้อ 29) อาจถูกสันนิษฐานโดยการนำไปปฏิบัติเพื่อยุติ [หมายเหตุ: สิ่งนี้มีจุดประสงค์เพื่อให้การแปลงคอมไพเลอร์เช่นการลบลูปที่ว่างเปล่าแม้ว่าจะไม่สามารถพิสูจน์ได้ว่าการเลิกจ้าง - …

6
ทำไม C ++ ไม่สามารถแยกวิเคราะห์ด้วยตัวแยกวิเคราะห์ LR (1)
ฉันอ่านเกี่ยวกับตัวแยกวิเคราะห์และตัวแยกวิเคราะห์และพบคำสั่งนี้ในการแยกวิเคราะห์ LR ของวิกิพีเดีย - หน้า: ภาษาการเขียนโปรแกรมจำนวนมากสามารถแยกวิเคราะห์ได้โดยใช้รูปแบบของตัวแยกวิเคราะห์ LR ข้อยกเว้นหนึ่งที่น่าสังเกตคือ C ++ ทำไมถึงเป็นเช่นนั้น? มีคุณสมบัติพิเศษใดของ C ++ ที่ทำให้ไม่สามารถวิเคราะห์ด้วยตัวแยกวิเคราะห์ LR ได้ เมื่อใช้ google ฉันพบว่า C สามารถแยกวิเคราะห์ได้อย่างสมบูรณ์แบบด้วย LR (1) แต่ C ++ ต้องใช้ LR (∞)

7
มันฉลาดที่จะแทนที่บูสต์ :: thread และ boost :: mutex ด้วย c ++ 11 เทียบเท่าหรือไม่?
แรงจูงใจ: เหตุผลที่ฉันคิดว่าผู้จัดการโครงการอัจฉริยะของฉันคิดว่าการเพิ่มเป็นอีกการพึ่งพาและมันน่ากลัวเพราะ "คุณขึ้นอยู่กับมัน" (ฉันพยายามอธิบายคุณภาพของการส่งเสริมแล้วเลิกหลังจากนั้นสักครู่ :( ) เหตุผลที่เล็กกว่าที่ฉันต้องการทำคือฉันต้องการเรียนรู้คุณสมบัติ c ++ 11 เพราะผู้คนจะเริ่มเขียนโค้ดลงไปดังนั้น: มีการแมป 1: 1 ระหว่าง#include&lt;thread&gt; #include&lt;mutex&gt;และเพิ่มการเทียบเท่าหรือไม่ คุณจะพิจารณาความคิดที่ดีที่จะเปลี่ยนสิ่งที่เพิ่มด้วย C ++ 11 สิ่ง การใช้งานของฉันเป็นพื้นฐาน แต่มีตัวอย่างเมื่อ std ไม่เสนอเพิ่มอะไรบ้าง หรือ (ดูหมิ่น) ในทางกลับกัน? PS ฉันใช้ GCC ดังนั้นส่วนหัวจึงอยู่ที่นั่น


14
กำลังตรวจหาตัวชี้ NULL ใน C / C ++ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ในการตรวจสอบโค้ดเมื่อเร็ว ๆ นี้ผู้ให้ข้อมูลพยายามบังคับให้การNULLตรวจสอบพอยน์เตอร์ทั้งหมดดำเนินการในลักษณะดังต่อไปนี้: int * some_ptr; // ... if (some_ptr == NULL) { // Handle null-pointer error } else { // Proceed } แทน int * some_ptr; // ... if (some_ptr) { // Proceed } else { // Handle null-pointer error } …

6
เกิดอะไรขึ้นกับเธรดที่แยกออกเมื่อ main () ออกมา
สมมติว่าฉันเริ่มต้นstd::threadและจากนั้นdetach()เธรดจึงยังคงดำเนินการต่อแม้ว่าสิ่งstd::threadนั้นจะเป็นตัวแทนของมันก็ตาม สมมติเพิ่มเติมว่าโปรแกรมไม่มีโพรโทคอลที่เชื่อถือได้สำหรับการเข้าร่วมเธรดที่ดึงออก1ดังนั้นเธรดที่แยกออกมายังคงทำงานเมื่อmain()ออกจาก ฉันไม่พบสิ่งใดในมาตรฐาน (แม่นยำกว่าในร่าง N3797 C ++ 14) ซึ่งอธิบายสิ่งที่ควรเกิดขึ้นทั้ง 1.10 และ 30.3 ไม่มีถ้อยคำที่เกี่ยวข้อง 1อีกคำถามที่อาจเทียบเท่ากันคือ: "สามารถรวมเธรดที่แยกออกมาได้อีกครั้ง" เนื่องจากโปรโตคอลใดก็ตามที่คุณคิดค้นเพื่อเข้าร่วมส่วนการส่งสัญญาณจะต้องทำในขณะที่เธรดยังทำงานอยู่และตัวกำหนดตารางเวลาระบบปฏิบัติการอาจ ตัดสินใจที่จะทำให้เธรดเข้าสู่โหมดสลีปเป็นเวลาหนึ่งชั่วโมงหลังจากดำเนินการส่งสัญญาณโดยไม่มีวิธีสำหรับการสิ้นสุดการรับเพื่อตรวจสอบความน่าเชื่อถือของเธรดที่เสร็จสิ้น ถ้าวิ่งออกมาจากmain()กับหัวข้อแฝดทำงานเป็นพฤติกรรมที่ไม่ได้กำหนดไว้แล้วใด ๆ ที่ใช้std::thread::detach()เป็นพฤติกรรมที่ไม่ได้กำหนดเว้นแต่หัวข้อหลักไม่เคยออกจาก2 ดังนั้นการรันmain()เธรดที่แยกออกมาจะต้องมีเอฟเฟกต์ที่กำหนดไว้ คำถามคือ: ที่ไหน (ในมาตรฐาน C ++ , ไม่ใช่ POSIX, ไม่ใช่ OS เอกสาร, ... ) เป็นเอฟเฟกต์เหล่านั้นที่กำหนดไว้ 2ไม่สามารถเข้าร่วมเธรดเดี่ยวได้ (ในแง่ของstd::thread::join()) คุณสามารถรอผลจากหัวข้อแฝด (เช่นผ่านทางในอนาคตจากstd::packaged_taskหรือโดยสัญญาณการนับหรือธงและตัวแปรสภาพ) แต่ที่ไม่ได้รับประกันว่าด้ายได้เสร็จสิ้นการดำเนินการ อันที่จริงถ้าคุณใส่ส่วนการส่งสัญญาณเข้าไปในเตาเผาของวัตถุอัตโนมัติครั้งแรกของด้ายที่มีจะโดยทั่วไปจะเป็นรหัส (destructors) ที่ระยะหลังรหัสการส่งสัญญาณ หากระบบปฏิบัติการจัดตารางเวลาเธรดหลักเพื่อใช้ผลลัพธ์และออกก่อนที่เธรดที่แยกออกจะเสร็จสิ้นการรัน destructors ที่กล่าวไว้สิ่งใดที่ ^ Wis จะนิยามไว้จะเกิดอะไรขึ้น

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