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

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

9
เคยมีการเปลี่ยนแปลงพฤติกรรมเงียบใน C ++ ด้วยเวอร์ชันมาตรฐานใหม่หรือไม่?
(ฉันกำลังมองหาตัวอย่างหรือสองตัวอย่างเพื่อพิสูจน์ประเด็นไม่ใช่รายการ) เคยมีกรณีหรือไม่ที่การเปลี่ยนแปลงในมาตรฐาน C ++ (เช่นจาก 98 เป็น 11, 11 เป็น 14 เป็นต้น) เปลี่ยนพฤติกรรมของรหัสผู้ใช้ที่มีอยู่รูปแบบที่ดีและมีพฤติกรรมที่กำหนด - โดยไม่โต้ตอบ? เช่นไม่มีคำเตือนหรือข้อผิดพลาดเมื่อคอมไพล์กับเวอร์ชันมาตรฐานที่ใหม่กว่า? หมายเหตุ: ฉันกำลังถามเกี่ยวกับพฤติกรรมที่ได้รับคำสั่งตามมาตรฐานไม่ใช่เกี่ยวกับตัวเลือกผู้ดำเนินการ / ผู้เขียนคอมไพเลอร์ ยิ่งสร้างรหัสน้อยเท่าไหร่ก็ยิ่งดี (เป็นคำตอบสำหรับคำถามนี้) ฉันไม่ได้หมายถึงรหัสที่มีการตรวจจับเวอร์ชันเช่น#if __cplusplus >= 201103L. คำตอบเกี่ยวกับโมเดลหน่วยความจำนั้นใช้ได้

7
ความสับสนเกี่ยวกับการเริ่มต้นอาร์เรย์ใน C
ในภาษา C หากเริ่มต้นอาร์เรย์เช่นนี้: int a[5] = {1,2}; จากนั้นองค์ประกอบทั้งหมดของอาร์เรย์ที่ไม่ได้เตรียมใช้งานอย่างชัดเจนจะถูกกำหนดค่าเริ่มต้นโดยปริยายด้วยศูนย์ แต่ถ้าฉันเริ่มต้นอาร์เรย์เช่นนี้: int a[5]={a[2]=1}; printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3], a[4]); เอาต์พุต: 1 0 1 0 0 ฉันไม่เข้าใจทำไมa[0]พิมพ์1แทนที่จะเป็น0? เป็นพฤติกรรมที่ไม่ได้กำหนดหรือไม่? หมายเหตุ:คำถามนี้ถูกถามในการสัมภาษณ์

8
“ else if” เป็นคำหลักคำเดียวหรือไม่
ฉันยังใหม่กับ C ++ ฉันมักจะเห็นคำสั่งเงื่อนไขดังต่อไปนี้: if statement_0; else if statement_1; คำถาม: syntacticallyฉันจะรักษาelse ifเป็นคำหลักเดียว? หรือจริงๆแล้วมันเป็นifคำสั่งซ้อนกันภายในด้านนอกelseเหมือนด้านล่าง? if statement_0; else if statement_1;

7
โปรแกรมที่มีตัวแปร global ที่เรียกว่า main แทนฟังก์ชัน main ทำงานได้อย่างไร?
พิจารณาโปรแกรมต่อไปนี้: #include <iostream> int main = ( std::cout << "C++ is excellent!\n", 195 ); การใช้ g ++ 4.8.1 (mingw64) บน Windows 7 OS โปรแกรมจะคอมไพล์และทำงานได้ดีการพิมพ์: C ++ ยอดเยี่ยมมาก! ไปที่คอนโซล mainดูเหมือนจะเป็นตัวแปรส่วนกลางแทนที่จะเป็นฟังก์ชัน โปรแกรมนี้จะรันโดยไม่มีฟังก์ชันได้main()อย่างไร รหัสนี้เป็นไปตามมาตรฐาน C ++ หรือไม่ มีการกำหนดพฤติกรรมของโปรแกรมไว้อย่างดีหรือไม่? ฉันยังใช้-pedantic-errorsตัวเลือกนี้ แต่โปรแกรมยังคงรวบรวมและทำงาน

8
แคสต์ที่ไม่ได้ลงชื่อเพื่อลงนามที่มีประสิทธิภาพหลีกเลี่ยงพฤติกรรมที่กำหนดการนำไปใช้งาน
ฉันต้องการกำหนดฟังก์ชันที่รับunsigned intอาร์กิวเมนต์เป็นและส่งคืนintโมดูโลที่สอดคล้องกัน UINT_MAX + 1 ให้กับอาร์กิวเมนต์ ความพยายามครั้งแรกอาจมีลักษณะดังนี้: int unsigned_to_signed(unsigned n) { return static_cast<int>(n); } แต่อย่างที่นักกฎหมายภาษาใด ๆ ทราบการคัดเลือกจากไม่ได้ลงนามเป็นเซ็นชื่อสำหรับค่าที่มีขนาดใหญ่กว่า INT_MAX นั้นถูกกำหนดให้ใช้งานได้ ฉันต้องการใช้สิ่งนี้ซึ่ง (ก) อาศัยเฉพาะพฤติกรรมที่กำหนดโดยข้อมูลจำเพาะเท่านั้น และ (b) รวบรวมเป็น no-op บนเครื่องที่ทันสมัยและปรับแต่งคอมไพเลอร์ สำหรับเครื่องจักรที่แปลกประหลาด ... หากไม่มีโมดูโลคอนดักเตอร์ int ที่ลงนาม UINT_MAX + 1 ไปยัง int ที่ไม่ได้ลงนามสมมติว่าฉันต้องการยกเว้น ถ้ามีมากกว่าหนึ่ง (ฉันไม่แน่ใจว่าเป็นไปได้) สมมติว่าฉันต้องการอันที่ใหญ่ที่สุด ตกลงครั้งที่สอง: int unsigned_to_signed(unsigned n) { int int_n = static_cast<int>(n); …

2
รหัสจาก“ ภาษาโปรแกรม C ++” ฉบับที่ 4 ส่วน 36.3.6 มีลักษณะการทำงานที่กำหนดไว้อย่างชัดเจนหรือไม่
ใน Bjarne Stroustrup ของc ++ เขียนโปรแกรมภาษาส่วนฉบับที่ 4 36.3.6 STL เหมือนการดำเนินงานรหัสต่อไปนี้จะใช้เป็นตัวอย่างของการผูกมัด : void f2() { std::string s = "but I have heard it works even if you don't believe in it" ; s.replace(0, 4, "" ).replace( s.find( "even" ), 4, "only" ) .replace( s.find( " don't" ), 6, "" ); assert( …

3
การพิมพ์พอยน์เตอร์ว่างด้วย% p เป็นพฤติกรรมที่ไม่ได้กำหนด?
เป็นพฤติกรรมที่ไม่ได้กำหนดไว้ในการพิมพ์พอยน์เตอร์ว่างด้วยตัว%pระบุการแปลงหรือไม่ #include <stdio.h> int main(void) { void *p = NULL; printf("%p", p); return 0; } คำถามนี้ใช้กับมาตรฐาน C ไม่ใช่กับการใช้งาน C

3
ข้อมูลประเภทไหลย้อนกลับใน C ++ เมื่อใด
ฉันเพิ่งดู Stephan T. Lavavej พูดในCppCon 2018เรื่อง "Class Template Argument Deduction" ซึ่งในบางครั้งเขาก็พูดว่า: ข้อมูลชนิด C ++ เกือบจะไม่ไหลย้อนกลับ ... ผมต้องพูดว่า "เกือบ" เพราะมีหนึ่งหรือสองกรณีอาจจะมากกว่า แต่น้อยมาก แม้จะพยายามคิดว่ากรณีใดที่เขาอาจอ้างถึง แต่ฉันก็คิดอะไรไม่ออก ดังนั้นคำถาม: ในกรณีใดบ้างที่มาตรฐาน C ++ 17 กำหนดให้ข้อมูลประเภทเผยแพร่ย้อนกลับ

4
เหตุใด (เฉพาะ) คอมไพเลอร์บางตัวจึงใช้แอดเดรสเดียวกันสำหรับตัวอักษรสตริงที่เหมือนกัน
https://godbolt.org/z/cyBiWY ฉันเห็น'some'ตัวอักษรสองตัวในโค้ดแอสเซมเบลอร์ที่สร้างโดย MSVC แต่มีเพียงตัวเดียวที่มี clang และ gcc สิ่งนี้นำไปสู่ผลลัพธ์ของการเรียกใช้โค้ดที่แตกต่างกันโดยสิ้นเชิง static const char *A = "some"; static const char *B = "some"; void f() { if (A == B) { throw "Hello, string merging!"; } } ใครสามารถอธิบายความแตกต่างและความคล้ายคลึงกันระหว่างผลลัพธ์การคอมไพล์เหล่านั้นได้บ้าง เหตุใด clang / gcc จึงเพิ่มประสิทธิภาพบางอย่างแม้ว่าจะไม่มีการร้องขอการปรับให้เหมาะสมก็ตาม นี่เป็นพฤติกรรมที่ไม่ได้กำหนดหรือไม่? ฉันยังสังเกตเห็นว่าถ้าฉันเปลี่ยนการประกาศเป็นที่แสดงด้านล่าง clang / gcc / msvc จะไม่ทิ้ง"some"รหัสแอสเซมเบลอร์เลย ทำไมพฤติกรรมถึงแตกต่างกัน? static …

3
คอนสตรัคเตอร์ส่วนตัวไม่ใช่คอนสตรัคเตอร์ส่วนตัวเมื่อใด
สมมติว่าฉันมีประเภทและฉันต้องการทำให้ตัวสร้างเริ่มต้นเป็นแบบส่วนตัว ฉันเขียนสิ่งต่อไปนี้: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); …

3
ฉันควรใช้ @classmethod เมื่อใดและเมื่อใดที่วิธี def (self)?
ในขณะที่รวมแอพ Django ที่ฉันไม่เคยใช้มาก่อนฉันพบสองวิธีที่แตกต่างกันที่ใช้ในการกำหนดฟังก์ชันในคลาส ผู้เขียนดูเหมือนจะใช้ทั้งสองอย่างตั้งใจมาก คนแรกคือตัวฉันเองใช้บ่อยมาก: class Dummy(object): def some_function(self,*args,**kwargs): do something here self is the class instance อีกอันคืออันที่ฉันไม่ได้ใช้ส่วนใหญ่เป็นเพราะฉันไม่เข้าใจว่าจะใช้เมื่อใดและทำเพื่ออะไร: class Dummy(object): @classmethod def some_function(cls,*args,**kwargs): do something here cls refers to what? ในเอกสาร Python classmethodมัณฑนากรอธิบายด้วยประโยคนี้: เมธอดคลาสได้รับคลาสเป็นอาร์กิวเมนต์แรกโดยนัยเช่นเดียวกับที่วิธีอินสแตนซ์ได้รับอินสแตนซ์ ดังนั้นฉันเดาว่าclsหมายถึงDummyตัวมันเอง ( classไม่ใช่อินสแตนซ์) ฉันไม่เข้าใจว่าทำไมสิ่งนี้ถึงมีอยู่เพราะฉันสามารถทำได้เสมอ: type(self).do_something_with_the_class นี่เป็นเพียงเพื่อความชัดเจนหรือว่าฉันพลาดส่วนที่สำคัญที่สุด: สิ่งที่น่ากลัวและน่าสนใจที่ไม่สามารถทำได้หากไม่มีมัน?

2
วงเล็บเสริมจะมีผลเมื่อใดนอกเหนือจากลำดับความสำคัญของตัวดำเนินการ
วงเล็บใน C ++ ถูกใช้ในหลาย ๆ ที่เช่นในการเรียกใช้ฟังก์ชันและการจัดกลุ่มนิพจน์เพื่อแทนที่ลำดับความสำคัญของตัวดำเนินการ นอกเหนือจากวงเล็บเสริมที่ผิดกฎหมาย (เช่นรอบรายการอาร์กิวเมนต์การเรียกใช้ฟังก์ชัน) ทั่วไป - แต่ไม่ใช่กฎสัมบูรณ์ของ C ++ คือวงเล็บพิเศษจะไม่ทำร้าย : 5.1 นิพจน์หลัก [expr.prim] 5.1.1 ทั่วไป [expr.prim.general] 6 นิพจน์ในวงเล็บคือนิพจน์หลักที่มีชนิดและค่าเหมือนกันกับนิพจน์ที่แนบมา การมีอยู่ของวงเล็บจะไม่ส่งผลต่อนิพจน์ว่าเป็น lvalue หรือไม่ นิพจน์วงเล็บสามารถใช้ในบริบทเดียวกับที่สามารถใช้นิพจน์ที่แนบมาได้ทุกประการและมีความหมายเหมือนกันยกเว้นที่ระบุไว้เป็นอย่างอื่น คำถาม : ในบริบทใดที่วงเล็บเสริมเปลี่ยนความหมายของโปรแกรม C ++ นอกเหนือจากการแทนที่ลำดับความสำคัญของตัวดำเนินการพื้นฐาน หมายเหตุ : ฉันพิจารณาข้อ จำกัด ของไวยากรณ์ตัวชี้ถึงสมาชิกที่&qualified-idไม่มีวงเล็บให้อยู่นอกขอบเขตเนื่องจากจำกัด ไวยากรณ์แทนที่จะอนุญาตให้สองไวยากรณ์ที่มีความหมายต่างกัน ในทำนองเดียวกันการใช้วงเล็บภายในนิยามมาโครของตัวประมวลผลล่วงหน้ายังป้องกันความสำคัญของตัวดำเนินการที่ไม่ต้องการ

2
เกิดข้อผิดพลาดเมื่อใช้การเตรียมใช้งานในคลาสของสมาชิกข้อมูลที่ไม่คงที่และตัวสร้างคลาสที่ซ้อนกัน
โค้ดต่อไปนี้ค่อนข้างไม่สำคัญและฉันคาดว่ามันควรจะคอมไพล์ได้ดี struct A { struct B { int i = 0; }; B b; A(const B& _b = B()) : b(_b) {} }; ฉันได้ทดสอบโค้ดนี้กับ g ++ เวอร์ชัน 4.7.2, 4.8.1, clang ++ 3.2 และ 3.3 นอกเหนือจากข้อเท็จจริงที่ว่า g ++ 4.7.2 segfaults ในโค้ดนี้ ( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770 ) คอมไพเลอร์ที่ผ่านการทดสอบอื่น ๆ ยังให้ข้อความแสดงข้อผิดพลาดที่ไม่ได้อธิบายอะไรมาก g ++ 4.8.1: test.cpp: …


3
นี่เป็นข้อผิดพลาดที่ทราบของ C ++ 11 สำหรับลูปหรือไม่?
สมมติว่าเรามีโครงสร้างสำหรับการถือครอง 3 คู่พร้อมฟังก์ชันสมาชิกบางอย่าง: struct Vector { double x, y, z; // ... Vector &negate() { x = -x; y = -y; z = -z; return *this; } Vector &normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // ... }; นี่เป็นเพียงเล็กน้อยที่ออกแบบมาเพื่อความเรียบง่าย …

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