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

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

4
“ int main (vooid)”? ทำงานอย่างไร?
เมื่อเร็ว ๆ นี้ฉันต้องพิมพ์โปรแกรมทดสอบ C ขนาดเล็กและในกระบวนการนี้ฉันได้สะกดคำผิดในฟังก์ชันหลักโดยบังเอิญใช้vooidแทนvoid. แต่มันก็ยังใช้งานได้ การลดลงเป็นเวอร์ชันสมบูรณ์ที่เล็กที่สุดฉันลงเอยด้วย: int main (vooid) { return 42; } นี้ไม่แน่นอนรวบรวม ( gcc -Wall -o myprog myprog.c) และเมื่อทำงานก็จะส่งกลับ 42 รหัสนี้ถูกต้องแค่ไหน? นี่คือการถอดเสียงและวางจากbashเชลล์ของฉันเพื่อแสดงสิ่งที่ฉันกำลังทำ: pax$ cat qq.c int main (vooid) { return 42; } pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq pax$ echo $? 42
135 c  syntax  main 

30
เคล็ดลับการเขียนโปรแกรม C ที่คุณชอบคืออะไร? [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน9 ปีที่ผ่านมา ล็อค คำถามนี้และคำตอบถูกล็อกเนื่องจากคำถามไม่ตรงประเด็น แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ยังไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ตัวอย่างเช่นฉันเพิ่งเจอสิ่งนี้ในเคอร์เนล linux: / * บังคับให้เกิดข้อผิดพลาดในการคอมไพล์หากเงื่อนไขเป็นจริง * / #define BUILD_BUG_ON (เงื่อนไข) ((โมฆะ) sizeof (ถ่าน [1 - 2 * !! (เงื่อนไข)])) ดังนั้นในโค้ดของคุณหากคุณมีโครงสร้างบางอย่างที่ต้องมีให้พูดขนาดหลาย ๆ 8 ไบต์อาจเป็นเพราะข้อ จำกัด ของฮาร์ดแวร์คุณสามารถทำได้: BUILD_BUG_ON ((sizeof (โครงสร้างของโครงสร้าง)% 8)! = 0); และจะไม่คอมไพล์เว้นแต่ขนาดของ struct mystruct จะเป็นผลคูณของ 8 และถ้าเป็นผลคูณของ 8 …
134 c 

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

3
วิธีการพิมพ์ uint64_t? ล้มเหลวกับ: "ต่อท้ายปลอม"% "ในรูปแบบ"
ฉันเขียนรหัสทดสอบที่ง่ายมากของ printf uint64_t: #include <inttypes.h> #include <stdio.h> int main() { uint64_t ui64 = 90; printf("test uint64_t : %" PRIu64 "\n", ui64); return 0; } ฉันใช้ ubuntu 11.10 (64 บิต) และ gcc เวอร์ชัน 4.6.1 เพื่อคอมไพล์ แต่ล้มเหลว: main.cpp: In function ‘int main()’: main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’ main.cpp:9:47: warning: spurious trailing …
134 c++  c 

20
ปลอดภัยไหมที่จะใช้ -1 เพื่อตั้งค่าบิตทั้งหมดให้เป็นจริง
ฉันเคยเห็นรูปแบบนี้ใช้มากใน C & C ++ unsigned int flags = -1; // all bits are true นี่เป็นวิธีพกพาที่ดีในการทำสิ่งนี้หรือไม่? หรือใช้อยู่0xffffffffหรือ~0ดีกว่า?
134 c++  c  binary  bit-fields 

17
เธรดของ Windows: _beginthread vs _beginthreadex vs CreateThread C ++
สิ่งที่เป็นวิธีที่ดีกว่าที่จะเริ่มต้นด้าย_beginthread, _beginthreadxหรือCreateThread? ฉันพยายามที่จะตรวจสอบสิ่งที่เป็นข้อดี / ข้อเสียของ_beginthread, และ_beginthreadex CreateThreadฟังก์ชั่นทั้งหมดนี้ส่งคืนตัวจัดการเธรดไปยังเธรดที่สร้างขึ้นใหม่ฉันรู้อยู่แล้วว่า CreateThread ให้ข้อมูลเพิ่มเติมเล็กน้อยเมื่อเกิดข้อผิดพลาด (สามารถตรวจสอบได้โดยการโทรGetLastError) ... แต่มีสิ่งใดบ้างที่ฉันควรพิจารณาเมื่อฉัน m โดยใช้ฟังก์ชันเหล่านี้หรือไม่ ฉันกำลังทำงานกับแอปพลิเคชัน windows ดังนั้นความเข้ากันได้ข้ามแพลตฟอร์มจึงไม่เป็นปัญหา ฉันได้อ่านเอกสาร msdn แล้วและฉันก็ไม่เข้าใจเช่นทำไมใคร ๆ ถึงตัดสินใจใช้ _beginthread แทน CreateThread หรือในทางกลับกัน ไชโย! อัปเดต: โอเคขอบคุณสำหรับข้อมูลทั้งหมดฉันได้อ่านในสถานที่สองสามแห่งที่ฉันไม่สามารถโทรหาได้WaitForSingleObject()หากฉันใช้_beginthread()แต่ถ้าฉันโทร_endthread()ในเธรดจะไม่ได้ผล? มีข้อตกลงอะไรบ้าง?
134 c++  c  multithreading  winapi 

3
ข้อผิดพลาด GCC ที่เป็นไปได้เมื่อส่งคืน struct จากฟังก์ชัน
ฉันเชื่อว่าฉันพบข้อผิดพลาดใน GCC ในขณะที่ใช้ PCG PRNG ของ O'Neill ( รหัสเริ่มต้นในคอมไพเลอร์ Explorer ของ Godbolt ) หลังจากการคูณoldstateด้วยMULTIPLIER(ผลลัพธ์ที่เก็บไว้ใน rdi) GCC จะไม่เพิ่มผลลัพธ์INCREMENTนั้นย้ายINCREMENTไปยัง rdx แทนซึ่งจะถูกใช้เป็นค่าส่งคืนของ rand32_ret.state ตัวอย่างที่ทำซ้ำได้ขั้นต่ำ ( Compiler Explorer ): #include <stdint.h> struct retstruct { uint32_t a; uint64_t b; }; struct retstruct fn(uint64_t input) { struct retstruct ret; ret.a = 0; ret.b = input * …
133 c  gcc  assembly  x86-64  compiler-bug 

7
เหตุใด“ sizeof (a? true: false)” จึงให้เอาต์พุตสี่ไบต์
ฉันมีโค้ดเล็ก ๆ เกี่ยวกับตัวsizeofดำเนินการกับตัวดำเนินการที่เกี่ยวข้อง: #include <stdio.h> #include <stdbool.h> int main() { bool a = true; printf("%zu\n", sizeof(bool)); // Ok printf("%zu\n", sizeof(a)); // Ok printf("%zu\n", sizeof(a ? true : false)); // Why 4? return 0; } เอาท์พุท ( GCC ): 1 1 4 // Why 4? แต่ที่นี่, printf("%zu\n", sizeof(a ? true : …

10
เหตุใดคอมไพเลอร์ C และ C ++ จึงอนุญาตให้มีความยาวอาร์เรย์ในลายเซ็นของฟังก์ชันเมื่อไม่เคยบังคับใช้
นี่คือสิ่งที่ฉันพบในช่วงการเรียนรู้ของฉัน: #include<iostream> using namespace std; int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; } ดังนั้นในตัวแปรint dis(char a[1])ที่[1]ดูเหมือนว่าจะทำอะไรและไม่ทำงานทั้งหมดเพราะฉันสามารถใช้ a[2]เช่นเดียวกับint a[]หรือchar *a. ฉันรู้ว่าชื่ออาร์เรย์เป็นตัวชี้และวิธีการถ่ายทอดอาร์เรย์ดังนั้นปริศนาของฉันจึงไม่เกี่ยวกับส่วนนี้ สิ่งที่ฉันอยากรู้คือทำไมคอมไพเลอร์ถึงยอมให้มีพฤติกรรมนี้ ( int a[1]) หรือมันมีความหมายอื่นที่ฉันไม่รู้?
133 c++  c  arrays 

5
อะไรคือความแตกต่างระหว่าง "mod" และ "ส่วนที่เหลือ"
เพื่อนของฉันบอกว่ามีความแตกต่างระหว่าง "mod" และ "ส่วนที่เหลือ" ถ้าเป็นเช่นนั้นความแตกต่างของ C และ C ++ คืออะไร? '%' หมายถึง "mod" หรือ "rem" ใน C หรือไม่
133 c  math  operators 

7
เหตุใดคอมไพเลอร์จึงไม่สามารถปรับแต่งลูปการเพิ่มที่คาดเดาได้ให้เหมาะสมกับการคูณ
นี่คือคำถามที่มาถึงใจในขณะที่อ่านคำตอบที่ยอดเยี่ยมโดยMysticialคำถาม: ทำไมมันเร็วขึ้นในการประมวลผลอาร์เรย์เรียงกว่าอาร์เรย์ไม่ได้เรียงลำดับ ? บริบทสำหรับประเภทที่เกี่ยวข้อง: const unsigned arraySize = 32768; int data[arraySize]; long long sum = 0; ในคำตอบของเขาเขาอธิบายว่า Intel Compiler (ICC) เพิ่มประสิทธิภาพสิ่งนี้: for (int i = 0; i < 100000; ++i) for (int c = 0; c < arraySize; ++c) if (data[c] >= 128) sum += data[c]; ... เป็นสิ่งที่เทียบเท่ากับสิ่งนี้: for (int …

25
ทำไมใคร ๆ ก็ใช้ C กับ C ++? [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา แม้ว่าผู้คนจะชอบบ่นเกี่ยวกับ C ++ แต่ฉันก็ไม่สามารถหาหลักฐานได้มากนักว่าทำไมคุณถึงต้องการเลือก C มากกว่า C ++ C ดูเหมือนจะไม่ได้รับสะเก็ดระเบิดเกือบเท่าและถ้า C ++ มีปัญหาเหล่านี้ทำไมคุณไม่สามารถ จำกัด ตัวเองไว้ที่ชุดย่อย C ได้? มีความคิด / ประสบการณ์อย่างไร
132 c++  c 

16
ฉันจะเข้ารหัส base64 (ถอดรหัส) ใน C ได้อย่างไร
ฉันมีข้อมูลไบนารีในตัวแปรถ่านที่ไม่ได้ลงชื่อ ฉันต้องการแปลงเป็น PEM base64 ใน c ฉันดูในไลบรารี openssl แต่ไม่พบฟังก์ชันใด ๆ ร่างกายมีความคิดบ้างไหม?
132 c  base64 

10
วิธีที่รวดเร็วในการติดตั้งพจนานุกรมในภาษา C
สิ่งหนึ่งที่ฉันพลาดขณะเขียนโปรแกรมใน C คือโครงสร้างข้อมูลพจนานุกรม วิธีใดที่สะดวกที่สุดในการใช้งานใน C? ฉันไม่ได้ต้องการประสิทธิภาพ แต่ง่ายต่อการเขียนโค้ดตั้งแต่เริ่มต้น ฉันไม่ต้องการให้มันเป็นแบบทั่วไปเช่นกัน - บางอย่างเช่น string-> int จะทำ แต่ฉันต้องการให้สามารถจัดเก็บรายการได้ตามจำนวนที่กำหนด โดยมีวัตถุประสงค์เพื่อเป็นการออกกำลังกาย ฉันรู้ว่ามีไลบรารีของบุคคลที่สามที่สามารถใช้ได้ แต่พิจารณาสักครู่ว่าไม่มีอยู่จริง ในสถานการณ์เช่นนี้วิธีใดเป็นวิธีที่เร็วที่สุดที่คุณสามารถใช้พจนานุกรมที่ตรงตามข้อกำหนดข้างต้น

13
ฉันจะสร้างลูปที่ไม่มีที่สิ้นสุดที่ไม่ได้รับการปรับให้เหมาะสมได้อย่างไร
มาตรฐาน C11 ดูเหมือนจะบ่งบอกว่างบการวนซ้ำที่มีการควบคุมการแสดงออกอย่างต่อเนื่องไม่ควรปรับให้เหมาะสม ฉันรับคำแนะนำจากคำตอบนี้ซึ่งอ้างอิงส่วน 6.8.5 จากร่างมาตรฐานโดยเฉพาะ: คำสั่งวนซ้ำซึ่งนิพจน์การควบคุมไม่ใช่นิพจน์คงที่ ... อาจถูกสันนิษฐานโดยการนำไปใช้เพื่อยุติ ในคำตอบนั้นระบุว่าการวนซ้ำเช่นwhile(1) ;นั้นไม่ควรมีการปรับให้เหมาะสม ดังนั้น ... ทำไม Clang / LLVM เพิ่มประสิทธิภาพลูปด้านล่าง (รวบรวมด้วยcc -O2 -std=c11 test.c -o test)? #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); die(); printf("unreachable\n"); } บนเครื่องของฉันสิ่งนี้จะพิมพ์ออกมาbeginและเกิดปัญหากับคำสั่งที่ผิดกฎหมาย ( ud2กับดักวางไว้die()) เมื่อวันที่ godboltputsเราจะเห็นว่าไม่มีอะไรที่จะถูกสร้างขึ้นหลังจากการเรียกร้องให้ มันเป็นงานที่ยากอย่างน่าประหลาดใจที่ทำให้ Clang แสดงผลวนลูปไม่สิ้นสุดภายใต้-O2- ในขณะที่ฉันสามารถทดสอบvolatileตัวแปรซ้ำได้ซึ่งเกี่ยวข้องกับการอ่านหน่วยความจำที่ฉันไม่ต้องการ และถ้าฉันทำอะไรแบบนี้: …

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