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

C เป็นภาษาโปรแกรมทั่วไปที่ใช้สำหรับการเขียนโปรแกรมระบบ (ระบบปฏิบัติการและฝังตัว), ห้องสมุด, เกมและข้ามแพลตฟอร์ม แท็กนี้ควรใช้กับคำถามทั่วไปที่เกี่ยวข้องกับภาษา C ตามที่กำหนดไว้ในมาตรฐาน ISO 9899 (เวอร์ชันล่าสุด 9899: 2018 เว้นแต่ระบุไว้เป็นอย่างอื่น - นอกจากนี้ยังติดแท็กคำขอเฉพาะรุ่นด้วย c89, c99, c11 ฯลฯ ) C แตกต่างจาก C ++ และไม่ควรใช้ร่วมกับแท็ก C ++ หากไม่มีเหตุผล


5
“ Objective-C คือส่วนเหนือของ C ที่เคร่งครัดกว่า C ++” หมายความว่าอย่างไร
จากสิ่งที่ฉันอ่าน: เหตุใด Objective-C จึงไม่ได้รับความนิยมมากนักนอกชุมชน Apple Objective-C เป็นส่วนเสริมของ C (ที่จริงแล้วเคร่งครัดกว่า C ++ มาก) ดังนั้นปัญหาความเข้ากันได้แบบย้อนหลังจึงไม่เกิดขึ้น ทุกสิ่งที่คุณทำได้ใน C คุณสามารถทำได้ใน Objective-C การเป็นซูเปอร์เซ็ตเป็นไบนารีเช่นการตั้งครรภ์ Obj-C เป็นส่วนเหนือของ C และ C ++ ไม่ใช่ superset หมายถึงอะไร? Object-C จะใกล้เคียงกว่า // เข้ากันได้กับ C ในทางใด Object-C ปฏิบัติตามปรัชญา C อย่างใกล้ชิดมากกว่า C ++ อย่างไร โปรแกรม C ใด ๆ สามารถคอมไพล์โดยไม่ต้องดัดแปลงโดยคอมไพเลอร์ Object-C (เข้ากันได้ 100%)? นี่เป็นคำถามเกี่ยวกับการออกแบบภาษาโปรแกรมและความเข้ากันได้มากกว่าสงครามที่ว่าอันไหนดีกว่ากัน
87 c++  objective-c  c 

10
ทำไม printf (“% f”, 0); ให้พฤติกรรมที่ไม่ได้กำหนด?
คำสั่ง printf("%f\n",0.0f); พิมพ์ 0. อย่างไรก็ตามคำสั่ง printf("%f\n",0); พิมพ์ค่าสุ่ม ฉันรู้ว่าฉันกำลังแสดงพฤติกรรมบางอย่างที่ไม่ได้กำหนด แต่ฉันไม่สามารถหาสาเหตุได้โดยเฉพาะ ค่าทศนิยมที่บิตทั้งหมดเป็น 0 ยังคงใช้ได้floatโดยมีค่าเป็น 0 floatและintมีขนาดเท่ากันบนเครื่องของฉัน (หากเกี่ยวข้องกัน) เหตุใดการใช้ลิเทอรัลจำนวนเต็มแทนที่จะเป็นลิเทอรัลจุดลอยตัวจึงprintfทำให้เกิดพฤติกรรมนี้ ปล. พฤติกรรมเดียวกันนี้สามารถมองเห็นได้ถ้าฉันใช้ int i = 0; printf("%f\n", i);


12
TCHAR ยังคงมีความเกี่ยวข้องอยู่หรือไม่?
ฉันเพิ่งเริ่มเขียนโปรแกรม Windows และหลังจากอ่านหนังสือ Petzold ฉันสงสัยว่า: ยังคงเป็นแนวทางปฏิบัติที่ดีในการใช้TCHARtype และ_T()function เพื่อประกาศสตริงหรือว่าฉันควรใช้wchar_tand L""strings ในโค้ดใหม่หรือไม่ ฉันจะกำหนดเป้าหมายเฉพาะ Windows 2000 ขึ้นไปและรหัสของฉันจะเป็นi18nตั้งแต่เริ่มต้น
87 c++  c  windows  unicode  wchar-t 

3
คอมไพเลอร์ gcc C เขียนด้วยตัว C เองหรือไม่?
คอมไพเลอร์ gcc C เขียนด้วยตัว C เองหรือไม่? หรือเขียนไว้ใน Assembly? ถ้าคอมไพเลอร์เขียนด้วย C แล้วคอมไพเลอร์ที่ใช้ในการรวบรวมโค้ดคอมไพเลอร์คืออะไร?

7
C / C ++: บังคับลำดับฟิลด์บิตและการจัดตำแหน่ง
ฉันอ่านว่าลำดับของเขตข้อมูลบิตภายในโครงสร้างเป็นแพลตฟอร์มเฉพาะ แล้วถ้าฉันใช้ตัวเลือกการบรรจุเฉพาะของคอมไพเลอร์ที่แตกต่างกันข้อมูลการรับประกันนี้จะถูกจัดเก็บตามลำดับที่ถูกต้องตามที่เขียนหรือไม่ ตัวอย่างเช่น: struct Message { unsigned int version : 3; unsigned int type : 1; unsigned int id : 5; unsigned int data : 6; } __attribute__ ((__packed__)); บนโปรเซสเซอร์ Intel ที่มีคอมไพเลอร์ GCC ฟิลด์ต่างๆจะถูกจัดวางไว้ในหน่วยความจำตามที่แสดง Message.versionเป็น 3 บิตแรกในบัฟเฟอร์และMessage.typeตามด้วย หากฉันพบตัวเลือกการบรรจุโครงสร้างที่เทียบเท่ากันสำหรับคอมไพเลอร์ต่างๆสิ่งนี้จะเป็นข้ามแพลตฟอร์มหรือไม่

5
เหตุใด C และ C ++ จึงสนับสนุนการกำหนดอาร์เรย์แบบสมาชิกภายในโครงสร้าง แต่โดยทั่วไปแล้วไม่ใช่
ฉันเข้าใจว่าไม่รองรับการกำหนดอาร์เรย์แบบสมาชิกดังนั้นสิ่งต่อไปนี้จะใช้ไม่ได้: int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" ฉันเพิ่งยอมรับสิ่งนี้ว่าเป็นความจริงโดยคิดว่าจุดมุ่งหมายของภาษาคือการจัดเตรียมเฟรมเวิร์กแบบปลายเปิดและให้ผู้ใช้ตัดสินใจว่าจะใช้บางสิ่งบางอย่างเช่นการคัดลอกอาร์เรย์อย่างไร อย่างไรก็ตามสิ่งต่อไปนี้ใช้งานได้: struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1; อาร์เรย์num[3]เป็นสมาชิกที่กำหนดจากอินสแตนซ์ในstruct1อินสแตนซ์ในstruct2. เหตุใดการมอบหมายอาร์เรย์ที่ชาญฉลาดของสมาชิกจึงได้รับการสนับสนุนสำหรับโครงสร้าง แต่โดยทั่วไปไม่ได้รับการสนับสนุน แก้ไข : ความคิดเห็นของRoger Pateในเธรดstd :: string ใน struct - ปัญหาการคัดลอก / การกำหนด? ดูเหมือนจะชี้ไปในทิศทางทั่วไปของคำตอบ …

9
เหตุใดตำแหน่งที่คอมไพล์โค้ดทั้งหมดจึงไม่เป็นอิสระ
เมื่อคอมไพล์ไลบรารีที่แบ่งใช้ใน gcc อ็อพชัน -fPIC จะคอมไพล์โค้ดโดยไม่ขึ้นกับตำแหน่ง มีเหตุผลใดบ้าง (ประสิทธิภาพหรืออย่างอื่น) ทำไมคุณถึงไม่รวบรวมตำแหน่งโค้ดทั้งหมดโดยไม่ขึ้นกับใคร?
87 c  compilation 

12
จุดใดในลูปที่ทำให้จำนวนเต็มล้นกลายเป็นพฤติกรรมที่ไม่ได้กำหนด
นี่เป็นตัวอย่างเพื่ออธิบายคำถามของฉันซึ่งเกี่ยวข้องกับโค้ดที่ซับซ้อนกว่านี้ซึ่งฉันไม่สามารถโพสต์ได้ที่นี่ #include <stdio.h> int main() { int a = 0; for (int i = 0; i < 3; i++) { printf("Hello\n"); a = a + 1000000000; } } โปรแกรมนี้มีพฤติกรรมที่ไม่ได้กำหนดบนแพลตฟอร์มของฉันเพราะaจะล้นในลูปที่ 3 นั่นทำให้โปรแกรมทั้งหมดมีพฤติกรรมที่ไม่ได้กำหนดไว้หรือหลังจากเกิดเหตุการณ์ล้นขึ้นจริงหรือไม่? คอมไพเลอร์สามารถทำงานได้หรือไม่ที่a จะล้นออกมาเพื่อให้สามารถประกาศลูปทั้งหมดโดยไม่ได้กำหนดและไม่ต้องกังวลกับการรัน printfs แม้ว่าทั้งหมดจะเกิดขึ้นก่อนที่จะล้น (ติดแท็ก C และ C ++ แม้ว่าจะแตกต่างกันเพราะฉันสนใจคำตอบสำหรับทั้งสองภาษาหากแตกต่างกัน)


12
ตัวชี้ฟังก์ชันการปิดและแลมด้า
ตอนนี้ฉันเพิ่งเรียนรู้เกี่ยวกับตัวชี้ฟังก์ชันและในขณะที่ฉันกำลังอ่านบท K&R ในเรื่องนี้สิ่งแรกที่โดนใจฉันคือ "เฮ้นี่มันเหมือนกับการปิด" ฉันรู้ว่าสมมติฐานนี้ผิดโดยพื้นฐานแล้วและหลังจากการค้นหาทางออนไลน์ฉันไม่พบการวิเคราะห์ใด ๆ เกี่ยวกับการเปรียบเทียบนี้เลย เหตุใดตัวชี้ฟังก์ชันสไตล์ C จึงแตกต่างจากการปิดหรือแลมบ์ดาโดยพื้นฐาน? เท่าที่ฉันสามารถบอกได้ว่ามันเกี่ยวข้องกับความจริงที่ว่าตัวชี้ฟังก์ชันยังคงชี้ไปที่ฟังก์ชันที่กำหนด (ชื่อ) ซึ่งตรงข้ามกับการฝึกกำหนดฟังก์ชันโดยไม่ระบุตัวตน เหตุใดการส่งผ่านฟังก์ชันไปยังฟังก์ชันจึงถูกมองว่ามีประสิทธิภาพมากกว่าในกรณีที่สองโดยที่ไม่มีชื่อมากกว่าฟังก์ชันแรกที่เป็นเพียงฟังก์ชันปกติในชีวิตประจำวันที่ถูกส่งผ่าน โปรดบอกฉันว่าทำไมฉันถึงคิดผิดที่เปรียบเทียบทั้งสองอย่างใกล้ชิด ขอบคุณ.

3
ตัวระบุรูปแบบ size_t อิสระของแพลตฟอร์มใน c?
ฉันต้องการพิมพ์ตัวแปรประเภทsize_tC แต่ปรากฏว่าsize_tมีการใช้นามแฝงเป็นตัวแปรประเภทต่างๆในสถาปัตยกรรมที่แตกต่างกัน ตัวอย่างเช่นในเครื่องเดียว (64 บิต) รหัสต่อไปนี้จะไม่แสดงคำเตือนใด ๆ : size_t size = 1; printf("the size is %ld", size); แต่ในเครื่องอื่นของฉัน (32 บิต) รหัสด้านบนจะสร้างข้อความเตือนต่อไปนี้: คำเตือน: รูปแบบ '% ld' คาดว่าจะเป็นประเภท 'long int *' แต่อาร์กิวเมนต์ 3 มีประเภท 'size_t *' ฉันสงสัยว่านี่เป็นเพราะความแตกต่างของขนาดตัวชี้ดังนั้นบนเครื่อง 64 บิตของฉันsize_tจึงมีนามแฝงเป็น a long int( "%ld") ในขณะที่เครื่อง 32 บิตของฉันsize_tมีนามแฝงเป็นประเภทอื่น มีตัวระบุรูปแบบสำหรับsize_tหรือไม่

30
ทำไมคุณถึงตั้งโปรแกรมในการประกอบ? [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการ1 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันมีคำถามสำหรับแฮกเกอร์ระดับต่ำที่ไม่ยอมใครง่ายๆทั้งหมดที่นั่น ฉันเจอประโยคนี้ในบล็อก ฉันไม่คิดว่าแหล่งที่มามีความสำคัญ (เป็นเรื่องที่ฮากถ้าคุณสนใจจริงๆ) เพราะมันดูเหมือนจะเป็นคำพูดทั่วไป ตัวอย่างเช่นเกม 3 มิติสมัยใหม่จำนวนมากมีเอ็นจิ้นหลักประสิทธิภาพสูงที่เขียนด้วย C ++ และ Assembly เท่าที่แอสเซมบลีจะดำเนินไป - คือโค้ดที่เขียนขึ้นในแอสเซมบลีเนื่องจากคุณไม่ต้องการให้คอมไพเลอร์ปล่อยคำสั่งพิเศษหรือใช้ไบต์มากเกินไปหรือคุณใช้อัลกอริทึมที่ดีกว่าซึ่งคุณไม่สามารถแสดงใน C (หรือไม่สามารถแสดงออกได้โดยไม่ต้อง คอมไพเลอร์รวบรวมพวกเขาขึ้น)? ฉันเข้าใจดีว่าการเข้าใจสิ่งที่มีระดับต่ำเป็นสิ่งสำคัญ ฉันแค่อยากเข้าใจว่าทำไมต้องใช้โปรแกรมในแอสเซมบลีหลังจากที่คุณเข้าใจแล้ว

7
มาตรฐาน C ระบุค่าความจริงอย่างชัดเจนเป็น 0 หรือ 1 หรือไม่
เรารู้ว่าตัวเลขใด ๆ ที่ไม่เท่ากับจะ0ถูกมองtrueใน C ดังนั้นเราจึงสามารถเขียน: int a = 16; while (a--) printf("%d\n", a); // prints numbers from 15 to 0 อย่างไรก็ตามฉันสงสัยว่าจริง / เท็จถูกกำหนดให้เป็น1/ 0ใน C ดังนั้นฉันจึงลองใช้รหัสด้านล่าง: printf("True = %d, False = %d\n", (0 == 0), (0 != 0)); // prints: True = 1, False = 0 ไม่มาตรฐาน C อย่างชัดเจนระบุค่าความจริงของความจริงและเท็จเป็น1และ0ตามลำดับ?
86 c 

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