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

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

19
ฉันสามารถใช้ตัวอักษรไบนารีใน C หรือ C ++ ได้ไหม?
ฉันต้องทำงานกับเลขฐานสอง ฉันพยายามเขียน: const x = 00010000; แต่มันไม่ทำงาน ฉันรู้ว่าฉันสามารถใช้เลขฐานสิบหกที่มีค่าเหมือน00010000กัน แต่ฉันต้องการที่จะรู้ว่ามีชนิดใน C ++ สำหรับเลขฐานสองหรือไม่และถ้าไม่มีจะมีวิธีแก้ไขปัญหาของฉันอีกหรือไม่
191 c++  c  binary 

3
การจัดรูปแบบ printf () สำหรับฐานสิบหก
นี่เป็นคำถามที่น่าสนใจมากกว่าคำถามสำคัญ แต่ทำไมเมื่อพิมพ์เลขฐานสิบหกเป็นตัวเลข 8 หลักพร้อมเลขศูนย์นำหน้าสิ่งนี้จะ%#08Xไม่แสดงผลลัพธ์เดียวกัน0x%08Xหรือไม่ เมื่อฉันพยายามใช้อดีต 088ธงการจัดรูปแบบจะถูกลบออกและมันไม่ได้ทำงานที่มีเพียง อีกครั้งฉันแค่อยากรู้
191 c  printf  hex 

2
Bit Masking คืออะไร
ฉันค่อนข้างใหม่สำหรับการเขียนโปรแกรม C และฉันพบการปิดบังเล็กน้อย บางคนสามารถอธิบายแนวคิดและหน้าที่ทั่วไปของการปิดบังบิตให้ฉันได้หรือไม่ ตัวอย่างชื่นชมมาก

12
การค้นหาเส้นทางของไฟล์เรียกทำงานปัจจุบันโดยไม่มี / proc / self / exe
สำหรับฉันแล้วดูเหมือนว่า Linux สามารถใช้งานได้ง่ายกับ / proc / self / exe แต่ฉันต้องการทราบว่ามีวิธีที่สะดวกในการค้นหาไดเรกทอรีของแอปพลิเคชันปัจจุบันใน C / C ++ พร้อมอินเทอร์เฟซข้ามแพลตฟอร์มหรือไม่ ฉันเคยเห็นบางโครงการล้อเล่นกับ argv [0] แต่ดูเหมือนจะไม่น่าเชื่อถือทั้งหมด หากคุณเคยให้การสนับสนุนพูดว่า Mac OS X ซึ่งไม่มี / proc / คุณจะทำอะไร ใช้ #ifdefs เพื่อแยกรหัสเฉพาะแพลตฟอร์ม (ตัวอย่างเช่น NSBundle) หรือไม่ หรือพยายามที่จะอนุมานเส้นทางของปฏิบัติการจาก argv [0], $ PATH และอะไรก็ตามที่เสี่ยงต่อการหาข้อบกพร่องในกรณีขอบ
190 c++  c  linux  macos  executable 

6
ที่อยู่ของอาร์เรย์นั้นมีค่าเท่ากับมูลค่าใน C อย่างไร
ในรหัสต่อไปนี้ค่าของตัวชี้และที่อยู่ของตัวชี้จะแตกต่างกันตามที่คาดไว้ แต่ค่าและที่อยู่ของอาร์เรย์ไม่ได้! สิ่งนี้จะเป็นอย่างไร เอาท์พุต my_array = 0022FF00 &my_array = 0022FF00 pointer_to_array = 0022FF00 &pointer_to_array = 0022FEFC #include <stdio.h> int main() { char my_array[100] = "some cool string"; printf("my_array = %p\n", my_array); printf("&my_array = %p\n", &my_array); char *pointer_to_array = my_array; printf("pointer_to_array = %p\n", pointer_to_array); printf("&pointer_to_array = %p\n", &pointer_to_array); printf("Press ENTER to …
189 c  pointers  arrays 

12
ส่งต่อการเรียกใช้ฟังก์ชัน Variadic ใน C
ใน C เป็นไปได้ไหมที่จะส่งต่อการเรียกใช้ฟังก์ชัน Variadic ในขณะที่ int my_printf(char *fmt, ...) { fprintf(stderr, "Calling printf with fmt %s", fmt); return SOMEHOW_INVOKE_LIBC_PRINTF; } การส่งต่อการเรียกใช้ในลักษณะข้างต้นไม่จำเป็นอย่างชัดเจนในกรณีนี้ (เนื่องจากคุณสามารถเข้าสู่ระบบการร้องขอในรูปแบบอื่นหรือใช้ vfprintf) แต่รหัสฐานที่ฉันกำลังทำงานอยู่นั้นต้องใช้กระดาษห่อเพื่อทำงานจริงและไม่จำเป็น ไม่มี (และไม่สามารถเพิ่มได้) ฟังก์ชันตัวช่วยคล้ายกับ vfprintf [อัปเดต: ดูเหมือนจะมีความสับสนตามคำตอบที่ให้มาจนถึงตอนนี้ ในการตั้งคำถามด้วยวิธีอื่น: โดยทั่วไปคุณสามารถรวมฟังก์ชัน Variadic ตามใจชอบได้โดยไม่ต้องแก้ไขนิยามของฟังก์ชันนั้น]
189 c  variadic 

25
การปัดเศษขึ้นเป็นกำลังต่อไปของ 2
ฉันต้องการเขียนฟังก์ชั่นที่คืนค่ากำลังสองถัดไปที่ใกล้ที่สุด ตัวอย่างเช่นถ้าอินพุตของฉันคือ 789 ผลลัพธ์ควรเป็น 1024 มีวิธีใดบ้างที่จะบรรลุผลนี้โดยไม่ใช้ลูปใด ๆ แต่ใช้ตัวดำเนินการระดับบิต?

13
C ไม่ใช่เรื่องยาก: void (* (* f []) ()) ()
ฉันเพิ่งเห็นภาพวันนี้และคิดว่าฉันชอบคำอธิบาย ดังนั้นนี่คือภาพ: ฉันพบว่ามันสับสนและสงสัยว่ารหัสดังกล่าวเป็นประโยชน์ ฉันไปที่รูปภาพและพบรูปภาพอื่นในรายการ reddit นี้และนี่คือรูปภาพนั้น: ดังนั้น "การอ่านแบบวน" นี้เป็นสิ่งที่ถูกต้อง? นี่เป็นวิธีคอมไพเลอร์ของ C หรือไม่? มันคงจะดีถ้ามีคำอธิบายที่ง่ายกว่าสำหรับโค้ดแปลก ๆ นี้ นอกจากรหัสประเภทนี้จะมีประโยชน์หรือไม่ ถ้าเป็นเช่นนั้นที่ไหนและเมื่อไหร่? มีคำถามเกี่ยวกับ "กฎส่วนก้นหอย" แต่ฉันไม่เพียงแค่ถามว่ามันถูกนำไปใช้อย่างไรหรือวิธีการอ่านนิพจน์ที่มีกฎนั้น ฉันกำลังถามถึงการใช้ความถูกต้องของนิพจน์และกฎของเกลียวเช่นกัน เกี่ยวกับสิ่งเหล่านี้คำตอบที่ดีมีการโพสต์แล้ว

5
ข้อผิดพลาด“ องค์ประกอบเริ่มต้นไม่คงที่” เมื่อพยายามเริ่มต้นตัวแปรด้วย const
ฉันได้รับข้อผิดพลาดในบรรทัดที่ 6 (เริ่มต้น my_foo เป็น foo_init) ของโปรแกรมต่อไปนี้และฉันไม่แน่ใจว่าฉันเข้าใจว่าทำไม typedef struct foo_t { int a, b, c; } foo_t; const foo_t foo_init = { 1, 2, 3 }; foo_t my_foo = foo_init; int main() { return 0; } โปรดทราบว่านี่เป็นเวอร์ชันที่เรียบง่ายของโครงการหลายไฟล์ขนาดใหญ่ที่ฉันกำลังทำงานอยู่ เป้าหมายคือการมีค่าคงที่เดียวในไฟล์อ็อบเจ็กต์ที่หลายไฟล์สามารถใช้เพื่อเริ่มต้นโครงสร้างสถานะ เนื่องจากเป็นเป้าหมายแบบฝังที่มีทรัพยากร จำกัด และโครงสร้างไม่เล็กฉันจึงไม่ต้องการสำเนาหลายชุด ฉันไม่ต้องการใช้: #define foo_init { 1, 2, 3 } ฉันกำลังพยายามเขียนโค้ดแบบพกพาด้วยดังนั้นฉันจึงต้องการโซลูชันที่ใช้ได้กับ …
187 c  initialization 

13
ทำไมเครื่องหมายดอกจันอยู่ข้างหน้าชื่อตัวแปรแทนที่จะเป็นประเภทหลัง
ทำไมตัวแปรชื่อโปรแกรมเมอร์ซีส่วนใหญ่เช่นนี้: int *myVariable; มากกว่าเช่นนี้ int* myVariable; ทั้งสองถูกต้อง ดูเหมือนว่าฉันว่าเครื่องหมายดอกจันเป็นส่วนหนึ่งของประเภทไม่ใช่ส่วนหนึ่งของชื่อตัวแปร ใครสามารถอธิบายเหตุผลนี้

3
สาขา () สาขามากกว่าที่คาดไว้หรือไม่
พิจารณารหัสต่อไปนี้: #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; } โปรแกรมนี้ให้ผลลัพธ์ 8 จุด เป็นไปได้อย่างไร? ไม่ควรมี 6 จุดแทนใช่ไหม
186 c++  c  fork 

9
gcc มองหาไฟล์ส่วนหัว C และ C ++ ที่ไหน
บนระบบ Unix gcc จะค้นหาไฟล์ส่วนหัวที่ไหน? ฉันใช้เวลาเล็กน้อยในเช้านี้เพื่อค้นหาไฟล์ส่วนหัวของระบบดังนั้นฉันคิดว่านี่จะเป็นข้อมูลที่ดีที่จะมีที่นี่
186 c  gcc  header 

1
GCC และ g ++ bootstrapped เป็นอย่างไร
สิ่งนี้ได้ดักฟังฉันมาระยะหนึ่งแล้ว GCC และ g ++ รวบรวมตัวเองอย่างไร ฉันเดาว่าการแก้ไขทุกครั้งจะได้รับการคอมไพล์ด้วยการแก้ไขที่สร้างไว้ก่อนหน้านี้ มันเป็นเรื่องจริงเหรอ? และถ้าเป็นเช่นนั้นหมายความว่ารุ่นเก่าที่สุดของ g ++ และ GCC ถูกเขียนไว้ในชุดประกอบหรือไม่?

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

6
มีการจัดรูปแบบอาร์เรย์หลายมิติในหน่วยความจำอย่างไร
ใน C ฉันรู้ว่าฉันสามารถจัดสรรอาเรย์สองมิติแบบไดนามิกบนฮีปโดยใช้โค้ดต่อไปนี้: int** someNumbers = malloc(arrayRows*sizeof(int*)); for (i = 0; i < arrayRows; i++) { someNumbers[i] = malloc(arrayColumns*sizeof(int)); } เห็นได้ชัดว่าสิ่งนี้สร้างอาร์เรย์พอยน์เตอร์หนึ่งมิติไปยังอาร์เรย์จำนวนเต็มหนึ่งมิติที่แยกจากกันและ "ระบบ" สามารถหาสิ่งที่ฉันหมายถึงเมื่อฉันขอ: someNumbers[4][2]; แต่เมื่อฉันประกาศอาร์เรย์ 2 มิติแบบคงที่ดังในบรรทัดต่อไปนี้ ... : int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS]; ... โครงสร้างที่คล้ายกันนี้ถูกสร้างขึ้นบนสแต็กหรือเป็นรูปแบบอื่นอย่างสมบูรณ์หรือไม่ (เช่นเป็นตัวชี้อาร์เรย์ 1D หรือไม่ถ้าไม่ใช่มันคืออะไรและการอ้างอิงถึงมันคิดออกได้อย่างไร) นอกจากนี้เมื่อฉันพูดว่า "ระบบ" อะไรคือสิ่งที่ต้องรับผิดชอบในการหาสิ่งนั้น เคอร์เนล หรือคอมไพเลอร์ C เรียงลำดับขณะคอมไพล์หรือไม่?

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