คำถามติดแท็ก language-lawyer

สำหรับคำถามเกี่ยวกับความซับซ้อนของข้อกำหนดอย่างเป็นทางการหรือมีสิทธิ์ของภาษาโปรแกรมและสภาพแวดล้อม

8
C ++ 11 แนะนำรุ่นหน่วยความจำที่ได้มาตรฐาน มันหมายความว่าอะไร? แล้วมันจะมีผลกับการเขียนโปรแกรม C ++ อย่างไร?
C ++ 11 นำเสนอโมเดลหน่วยความจำที่ได้มาตรฐาน แต่นั่นหมายความว่าอย่างไร แล้วมันจะมีผลกับการเขียนโปรแกรม C ++ อย่างไร? บทความนี้ (โดยกาวินคล๊าร์คซึ่งเป็นผู้เสนอราคาHerb Sutter ) กล่าวว่า รุ่นหน่วยความจำหมายความว่าตอนนี้รหัส C ++ มีไลบรารีมาตรฐานที่จะเรียกโดยไม่คำนึงว่าใครเป็นผู้สร้างคอมไพเลอร์และแพลตฟอร์มใดที่ทำงานอยู่ มีวิธีมาตรฐานในการควบคุมว่าเธรดที่แตกต่างพูดคุยกับหน่วยความจำของโปรเซสเซอร์ได้อย่างไร “ เมื่อคุณกำลังพูดถึงการแยก [รหัส] ข้ามคอร์ต่าง ๆ ที่อยู่ในมาตรฐานเรากำลังพูดถึงโมเดลหน่วยความจำเราจะเพิ่มประสิทธิภาพโดยไม่ทำลายสมมติฐานต่อไปนี้ที่ผู้คนจะทำในรหัส” ซัทเทอร์กล่าว ฉันสามารถจดจำย่อหน้านี้และย่อหน้าที่คล้ายกันได้ทางออนไลน์ (เนื่องจากฉันมีโมเดลความจำของตัวเองตั้งแต่แรกเกิด: P) และยังสามารถโพสต์เป็นคำตอบสำหรับคำถามที่ถามโดยคนอื่น ๆ แต่จริงๆแล้วฉันไม่เข้าใจเลย นี้. โปรแกรมเมอร์ C ++ เคยพัฒนาแอพพลิเคชั่นแบบมัลติเธรดมาก่อนดังนั้นมันจะสำคัญอย่างไรถ้าเป็นเธรด POSIX หรือเธรด Windows หรือเธรด C ++ 11 ประโยชน์คืออะไร ฉันต้องการที่จะเข้าใจรายละเอียดในระดับต่ำ ฉันรู้สึกเช่นนี้ด้วยว่ารูปแบบหน่วยความจำ C ++ 11 …

5
ใน CSS Flexbox เหตุใดจึงไม่มีคุณสมบัติ "ปรับรายการ" และ "จัดชิดขอบ"
พิจารณาแกนหลักและแกนไขว้ของเฟล็กซ์คอนเทนเนอร์: ที่มา: W3C ในการจัดแนวไอเท็มแบบเฟล็กซ์ตามแกนหลักมีหนึ่งคุณสมบัติ: justify-content ในการจัดแนวไอเท็มแบบเฟล็กซ์ตามแนวแกนข้ามมีคุณสมบัติสามอย่าง: align-content align-items align-self ในภาพด้านบนแกนหลักเป็นแนวนอนและแกนไขว้เป็นแนวตั้ง นี่เป็นทิศทางเริ่มต้นของ flex container อย่างไรก็ตามทิศทางเหล่านี้สามารถเปลี่ยนได้อย่างง่ายดายด้วยflex-directionคุณสมบัติ /* main axis is horizontal, cross axis is vertical */ flex-direction: row; flex-direction: row-reverse; /* main axis is vertical, cross axis is horizontal */ flex-direction: column; flex-direction: column-reverse; (แกนไขว้จะตั้งฉากกับแกนหลักเสมอ) ประเด็นของฉันในการอธิบายวิธีการทำงานของแกนคือดูเหมือนจะไม่มีอะไรพิเศษเกี่ยวกับทิศทางใดทิศทางหนึ่ง แกนหลักแกนไขว้พวกเขาทั้งสองมีความสำคัญเท่าเทียมกันและflex-directionทำให้สามารถสลับไปมาได้ง่าย เหตุใดแกนไขว้จึงได้รับคุณสมบัติการจัดตำแหน่งสองแบบเพิ่มเติม ทำไมalign-contentและถูกalign-itemsรวมเข้าในคุณสมบัติเดียวสำหรับแกนหลัก? ทำไมแกนหลักไม่ได้รับjustify-selfคุณสมบัติ? สถานการณ์ที่คุณสมบัติเหล่านี้มีประโยชน์: วางสิ่งของแบบยืดหยุ่นไว้ที่มุมของภาชนะบรรจุแบบยืดหยุ่น …

14
เราสามารถมีพอยน์เตอร์ได้กี่ระดับ
จำนวนพอยน์เตอร์ ( *) ที่อนุญาตให้มีในตัวแปรเดียว ลองพิจารณาตัวอย่างต่อไปนี้ int a = 10; int *p = &a; ในทำนองเดียวกันเราสามารถมี int **q = &p; int ***r = &q; และอื่น ๆ ตัวอย่างเช่น, int ****************zz;

20
int a [] = {1,2,}; อนุญาตให้ใช้เครื่องหมายจุลภาคแปลก มีเหตุผลพิเศษไหม?
บางทีฉันอาจไม่ได้มาจากโลกใบนี้ แต่ดูเหมือนว่าฉันต่อไปนี้ควรเป็นข้อผิดพลาดทางไวยากรณ์: int a[] = {1,2,}; //extra comma in the end แต่มันไม่ใช่ ฉันรู้สึกประหลาดใจเมื่อรหัสนี้รวบรวม Visual Studio แต่ฉันได้เรียนรู้ที่จะไม่ไว้วางใจ MSVC คอมไพเลอร์เท่าที่ c ++ กฎระเบียบที่เกี่ยวข้องเพื่อให้ผมตรวจสอบมาตรฐานและเป็นที่ได้รับอนุญาตตามมาตรฐานเช่นกัน คุณสามารถดู 8.5.1 สำหรับกฎไวยากรณ์หากคุณไม่เชื่อฉัน ทำไมถึงได้รับอนุญาต นี่อาจเป็นคำถามที่ไร้ประโยชน์ แต่ฉันต้องการให้คุณเข้าใจว่าทำไมฉันถึงถาม หากเป็นกรณีย่อยของกฎไวยากรณ์ทั่วไปฉันจะเข้าใจ - พวกเขาตัดสินใจที่จะไม่ทำให้ไวยากรณ์ทั่วไปยากขึ้นเพียงเพื่อไม่อนุญาตให้ใช้เครื่องหมายจุลภาคซ้ำซ้อนในตอนท้ายของรายการ initializer แต่ไม่อนุญาตให้ใช้เครื่องหมายจุลภาคเพิ่มเติมอย่างชัดเจน ยกตัวอย่างเช่นมันจะไม่ได้รับอนุญาตให้มีเครื่องหมายจุลภาคซ้ำซ้อนในตอนท้ายของรายการอาร์กิวเมนต์ฟังก์ชั่นการโทร (เมื่อฟังก์ชั่นใช้เวลา...) ซึ่งเป็นเรื่องปกติ ดังนั้นอีกครั้งมีเหตุผลใดที่อนุญาตให้ใช้เครื่องหมายจุลภาคซ้ำซ้อนนี้อย่างชัดเจนหรือไม่

7
รหัส C ++ สามารถใช้ได้ทั้งใน C ++ 03 และ C ++ 11 แต่ทำสิ่งที่แตกต่างกันหรือไม่
เป็นไปได้หรือไม่ที่รหัส C ++ จะสอดคล้องกับทั้งมาตรฐานC ++ 03และมาตรฐานC ++ 11แต่ทำสิ่งที่แตกต่างกันไปขึ้นอยู่กับมาตรฐานที่กำลังรวบรวม?

12
main เป็นตัวระบุ Java ที่ถูกต้องหรือไม่
ลูกคนหนึ่งของฉันเรียน Java ในโรงเรียนมัธยมและได้รับสิ่งนี้จากการทดสอบของเขา: ข้อใดต่อไปนี้เป็นตัวระบุที่ถูกต้องใน Java ก. 123java ข. main ค. java1234 ง. {abce จ. )whoot เขาตอบbและเข้าใจผิด ฉันดูคำถามและโต้แย้งว่าmain เป็นตัวระบุที่ถูกต้องและควรจะถูกต้อง เราดูข้อมูลจำเพาะ Java สำหรับตัวระบุและเสริมจุดนั้น นอกจากนี้เรายังเขียนโปรแกรมตัวอย่างที่มีการเรียกตัวแปรmainเช่นเดียวกับวิธีการ เขาสร้างข้อโต้แย้งที่เป็นลายลักษณ์อักษรซึ่งรวมถึงการอ้างอิงเอกสาร Java โปรแกรมทดสอบและครูเพิกเฉยและบอกว่าคำตอบยังไม่ถูกต้อง คือmainตัวระบุที่ถูกต้อง?

11
ทำไม f (i = -1, i = -1) พฤติกรรมที่ไม่ได้กำหนด?
ฉันกำลังอ่านเกี่ยวกับลำดับของการละเมิดการประเมินผลและพวกเขายกตัวอย่างที่ทำให้ฉันสงสัย 1) หากผลข้างเคียงของวัตถุสเกลาร์นั้นไม่ได้ถูกจัดลำดับสัมพันธ์กับผลข้างเคียงอื่นในวัตถุสเกลาร์เดียวกันพฤติกรรมนั้นจะไม่ได้กำหนดไว้ // snip f(i = -1, i = -1); // undefined behavior ในบริบทiนี้เป็นวัตถุสเกลาร์ซึ่งเห็นได้ชัดว่าหมายถึง ประเภทเลขคณิต (3.9.1), ประเภทการแจงนับ, ประเภทตัวชี้, ตัวชี้ไปยังประเภทสมาชิก (3.9.2), std :: nullptr_t, และเวอร์ชันที่ผ่านการรับรอง cv ของประเภทเหล่านี้ (3.9.3) เรียกว่าประเภทสเกลาร์ ฉันไม่เห็นว่าคำสั่งนั้นคลุมเครือในกรณีนั้นอย่างไร สำหรับฉันดูเหมือนว่าไม่ว่าอาร์กิวเมนต์แรกหรืออาร์กิวเมนต์ที่สองจะได้รับการประเมินก่อนiจะสิ้นสุดลง-1และอาร์กิวเมนต์ทั้งสองก็เช่น-1กัน บางคนช่วยอธิบายได้ไหม? UPDATE ฉันขอขอบคุณการอภิปรายทั้งหมด ถึงตอนนี้ฉันชอบคำตอบของ @ harmicมากเพราะมันทำให้เกิดข้อผิดพลาดและความซับซ้อนของการกำหนดคำสั่งนี้แม้จะมองไปข้างหน้าอย่างรวดเร็วในทันที @ acheong87ชี้ให้เห็นปัญหาบางอย่างที่เกิดขึ้นเมื่อใช้การอ้างอิง แต่ฉันคิดว่ามันเป็นมุมฉากกับผลข้างเคียงที่ตามมาของคำถามนี้ สรุป เนื่องจากคำถามนี้ได้รับความสนใจเป็นจำนวนมากฉันจะสรุปประเด็น / คำตอบหลัก ๆ ก่อนอื่นให้ฉันพูดนอกเรื่องเล็ก ๆ เพื่อชี้ให้เห็นว่า "ทำไม" สามารถมีความหมายที่แตกต่างกันอย่างใกล้ชิด …

8
ถูกต้อง แต่ไม่มีค่าไวยากรณ์ในตัวพิมพ์สลับหรือไม่
จากการพิมพ์ผิดเล็กน้อยฉันพบโครงสร้างนี้โดยบังเอิญ: int main(void) { char foo = 'c'; switch(foo) { printf("Cant Touch This\n"); // This line is Unreachable case 'a': printf("A\n"); break; case 'b': printf("B\n"); break; case 'c': printf("C\n"); break; case 'd': printf("D\n"); break; } return 0; } ดูเหมือนว่าprintfที่ด้านบนของswitchคำสั่งนั้นถูกต้อง แต่ก็ไม่สามารถเข้าถึงได้อย่างสมบูรณ์ ฉันได้คอมไพล์สะอาดโดยไม่มีแม้แต่คำเตือนเกี่ยวกับรหัสที่ไม่สามารถเข้าถึงได้ แต่สิ่งนี้ดูเหมือนไม่มีจุดหมาย คอมไพเลอร์ควรตั้งค่าสถานะนี้ว่าเป็นรหัสที่ไม่สามารถเข้าถึงได้หรือไม่ สิ่งนี้มีจุดประสงค์หรือไม่?

4
อะไรที่ทำให้ i = i ++ + 1; ถูกกฎหมายใน C ++ 17?
ก่อนที่คุณจะเริ่มตะโกนพฤติกรรมที่ไม่ได้กำหนดสิ่งนี้จะปรากฏในN4659 (C ++ 17) อย่างชัดเจน i = i++ + 1; // the value of i is incremented ยังอยู่ในN3337 (C ++ 11) i = i++ + 1; // the behavior is undefined มีอะไรเปลี่ยนแปลง จากสิ่งที่ฉันสามารถรวบรวมได้จาก[N4659 basic.exec] ยกเว้นที่ระบุไว้การประเมินผลของตัวถูกดำเนินการของแต่ละตัวดำเนินการและ subexpressions ของแต่ละนิพจน์จะไม่เกิดขึ้น [... ] การคำนวณค่าของตัวถูกดำเนินการของผู้ประกอบการจะถูกจัดลำดับก่อนที่การคำนวณมูลค่าของผลลัพธ์ของผู้ประกอบการ หากผลข้างเคียงต่อตำแหน่งหน่วยความจำนั้นไม่สัมพันธ์กันกับผลข้างเคียงอื่นในตำแหน่งหน่วยความจำเดียวกันหรือการคำนวณค่าโดยใช้ค่าของวัตถุใด ๆ ในตำแหน่งหน่วยความจำเดียวกันและอาจไม่เกิดขึ้นพร้อมกันพฤติกรรมจะไม่ถูกกำหนด ตำแหน่งที่กำหนดค่าไว้ที่[N4659 basic.type] สำหรับประเภทที่คัดลอกได้เล็กน้อยการแทนค่าเป็นชุดของบิตในการแสดงวัตถุที่กำหนดค่าซึ่งเป็นองค์ประกอบที่แยกจากกันหนึ่งชุดของการกำหนดค่าการนำไปปฏิบัติ จาก[N3337 basic.exec] ยกเว้นที่ระบุไว้การประเมินผลของตัวถูกดำเนินการของแต่ละตัวดำเนินการและ subexpressions …

6
C ++ 11, 14, 17 หรือ 20 มีค่าคงที่มาตรฐานสำหรับ pi หรือไม่?
มีปัญหาค่อนข้างโง่กับหมายเลข pi ใน C และ C ++ เท่าที่ฉันรู้M_PIกำหนดไว้math.hไม่จำเป็นต้องมีมาตรฐาน มาตรฐาน C ++ ใหม่แนะนำคณิตศาสตร์ที่ซับซ้อนจำนวนมากในไลบรารีมาตรฐาน - ฟังก์ชันไฮเพอร์โบลิกstd::hermiteและstd::cyl_bessel_iเครื่องกำเนิดเลขสุ่มที่แตกต่างกันเป็นต้น มาตรฐาน 'ใหม่' มีค่าคงที่สำหรับ pi หรือไม่? ถ้าไม่ - ทำไม คณิตศาสตร์ที่ซับซ้อนทั้งหมดนี้ทำงานอย่างไรหากปราศจากมัน? ฉันตระหนักถึงคำถามที่คล้ายกันเกี่ยวกับ pi ใน C ++ (เป็นเวลาหลายปีและมาตรฐานเก่า); ฉันต้องการทราบสถานะปัจจุบันของปัญหา ฉันสนใจด้วยเช่นกันว่าทำไมทำไม C ++ ถึงไม่มีค่าคงที่ pi แต่มีคณิตศาสตร์ที่ซับซ้อนกว่าเยอะ UPD: ฉันรู้ว่าฉันสามารถกำหนด pi ตัวเองเป็น 4 * atan (1) หรือ acos (1) หรือ double pi …

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) อาจถูกสันนิษฐานโดยการนำไปปฏิบัติเพื่อยุติ [หมายเหตุ: สิ่งนี้มีจุดประสงค์เพื่อให้การแปลงคอมไพเลอร์เช่นการลบลูปที่ว่างเปล่าแม้ว่าจะไม่สามารถพิสูจน์ได้ว่าการเลิกจ้าง - …

4
การเริ่มต้น C ++ เป็นศูนย์ - เหตุใด "b" ในโปรแกรมนี้จึงไม่ได้กำหนดค่าเริ่มต้น แต่มีการเริ่มต้นʻa`
ตามคำตอบที่ยอมรับ (และเท่านั้น) สำหรับคำถาม Stack Overflowนี้ การกำหนดตัวสร้างด้วย MyTest() = default; จะทำให้วัตถุเริ่มต้นเป็นศูนย์แทน แล้วทำไมต่อไปนี้ #include &lt;iostream&gt; struct foo { foo() = default; int a; }; struct bar { bar(); int b; }; bar::bar() = default; int main() { foo a{}; bar b{}; std::cout &lt;&lt; a.a &lt;&lt; ' ' &lt;&lt; b.b; } สร้างผลลัพธ์นี้: 0 …

1
คัดลอก / ย้ายการกำหนดใน std :: vector :: erase () และ std :: deque :: erase ()
ในขั้นตอนของการตอบคำถามอื่นฉัน stumbled เมื่อกรมธรรม์ที่แตกต่างกันเล็กน้อยและstd::vector::erase()std::deque::erase() นี่คือสิ่งที่ C ++ 14 พูดเกี่ยวกับstd::deque::erase( [deque.modifiers]/4-6เน้นของฉัน): ผลกระทบ: ... ความซับซ้อน:จำนวนการเรียกใช้ตัวทำลายจะเหมือนกับจำนวนขององค์ประกอบที่ลบ แต่จำนวนการเรียกไปยังตัวดำเนินการกำหนดไม่เกินจำนวนองค์ประกอบที่น้อยกว่าก่อนองค์ประกอบที่ถูกลบและจำนวนองค์ประกอบหลังจาก องค์ประกอบที่ถูกลบ โยน:Tไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ และนี่คือสิ่งที่กล่าวถึงเกี่ยวกับstd::vector::erase( [vector.modifiers]/3-5): ผลกระทบ: ... ซับซ้อน: destructor ของTที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบลบ แต่ผู้ประกอบการที่ได้รับมอบหมายย้ายของTที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบในเวกเตอร์หลังจากองค์ประกอบลบ โยน:Tไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ อย่างที่คุณเห็นข้อกำหนดข้อยกเว้นสำหรับทั้งสองอย่างนั้นเหมือนกัน แต่std::vectorมีการกล่าวถึงอย่างชัดเจนว่ามีการเรียกตัวดำเนินการกำหนดย้าย นอกจากนี้ยังมีความจำเป็นสำหรับการTที่จะเป็นMoveAssignableสำหรับerase()การทำงานกับทั้งstd::vectorและstd::deque(ตารางที่ 100) แต่นี่ไม่ได้หมายความถึงการปรากฏตัวของผู้ประกอบการที่ได้รับมอบหมายย้ายหนึ่งสามารถกำหนดผู้ประกอบการที่ได้รับมอบหมายคัดลอกและได้กำหนดดำเนินการกำหนดย้ายและชั้นนี้จะ เป็นMoveAssignable. ในกรณีนี้ฉันตรวจสอบด้วย GCC และ Clang และstd::vector::erase()เรียกตัวดำเนินการคัดลอกการมอบหมายงานหากไม่มีตัวดำเนินการกำหนดย้ายและstd::deque::erase()ทำแบบเดียวกัน ( DEMO ) คำถามคือ: ฉันพลาดอะไรไปหรือนี่เป็นปัญหา (บรรณาธิการ) ในมาตรฐาน? ปรับปรุง: ฉันได้ส่งlwg รุ่น #

3
โค้ดชิ้นนี้กำหนดขนาดอาร์เรย์โดยไม่ใช้ sizeof () ได้อย่างไร
จากคำถามสัมภาษณ์ C ฉันพบคำถามที่ระบุว่า "จะหาขนาดของอาร์เรย์ใน C โดยไม่ใช้ตัวดำเนินการ sizeof ได้อย่างไร" โดยมีวิธีแก้ไขดังนี้ มันใช้งานได้ แต่ฉันไม่เข้าใจว่าทำไม #include &lt;stdio.h&gt; int main() { int a[] = {100, 200, 300, 400, 500}; int size = 0; size = *(&amp;a + 1) - a; printf("%d\n", size); return 0; } ตามที่คาดไว้ผลตอบแทน 5 แก้ไข: ผู้คนชี้ให้เห็นคำตอบนี้แต่ไวยากรณ์แตกต่างกันเล็กน้อยนั่นคือวิธีการจัดทำดัชนี size = (&amp;arr)[1] - arr; ดังนั้นฉันเชื่อว่าคำถามทั้งสองถูกต้องและมีแนวทางในการแก้ปัญหาที่แตกต่างกันเล็กน้อย …

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