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

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

19
มันเร็วกว่าที่จะนับถอยหลังหรือไม่?
ครูวิทยาศาสตร์คอมพิวเตอร์ของเราเคยกล่าวไว้ว่าด้วยเหตุผลบางประการการนับถอยหลังจึงมีประสิทธิภาพมากกว่าการนับถอยหลัง ตัวอย่างเช่นหากคุณจำเป็นต้องใช้ FOR loop และไม่ได้ใช้ดัชนีการวนซ้ำที่ใดที่หนึ่ง (เช่นการพิมพ์บรรทัดของ N * ไปที่หน้าจอ) ฉันหมายถึงรหัสแบบนี้: for (i = N; i >= 0; i--) putchar('*'); ดีกว่า: for (i = 0; i < N; i++) putchar('*'); มันเป็นเรื่องจริงเหรอ? และถ้าเป็นเช่นนั้นมีใครรู้ว่าทำไม?
131 c  performance  loops 


2
ในโหมดเผยแพร่ลักษณะการทำงานของโค้ดไม่เป็นไปตามที่คาดไว้
รหัสต่อไปนี้สร้างผลลัพธ์ที่แตกต่างกันภายใต้โหมดดีบักและโหมดเผยแพร่ (โดยใช้ Visual Studio 2008): int _tmain(int argc, _TCHAR* argv[]) { for( int i = 0; i < 17; i++ ) { int result = i * 16; if( result > 255 ) { result = 255; } printf("i:%2d, result = %3d\n", i, result) ; } return 0; } ผลลัพธ์ของโหมดดีบักซึ่งเป็นไปตามที่คาดไว้: …

3
เหตุใดการวนซ้ำแบบง่ายจึงได้รับการปรับให้เหมาะสมเมื่อขีด จำกัด คือ 959 แต่ไม่ใช่ 960
พิจารณาลูปง่ายๆนี้: float f(float x[]) { float p = 1.0; for (int i = 0; i < 959; i++) p += 1; return p; } หากคุณคอมไพล์ด้วย gcc 7 (snapshot) หรือ clang (trunk) ด้วย-march=core-avx2 -Ofastคุณจะได้สิ่งที่คล้ายกับ. .LCPI0_0: .long 1148190720 # float 960 f: # @f vmovss xmm0, dword ptr [rip + .LCPI0_0] # …
131 c  gcc  optimization  clang 

4
การแปลงบูลเป็น int
การแปลงนี้เป็นแบบพกพาเพียงใด มั่นใจได้หรือไม่ว่าการยืนยันทั้งสองผ่าน int x = 4<5; assert(x==1); x = 4>5; assert(x==0); อย่าถามว่าทำไม ฉันรู้ว่ามันน่าเกลียด ขอบคุณ.
131 c++  c  c99 

4
GCC เริ่มต้นรวมไดเร็กทอรีอะไรบ้าง
เมื่อฉันรวบรวมไฟล์ต้นฉบับที่เรียบง่ายด้วย gcc ฉันไม่ต้องระบุพา ธ ไปยังไฟล์รวมมาตรฐานเช่น stdio หรือ stdlib GCC รู้วิธีค้นหาไฟล์เหล่านี้ได้อย่างไร มี/usr/includeเส้นทางเดินสายอยู่ภายในหรือไม่หรือจะได้รับเส้นทางจากส่วนประกอบระบบปฏิบัติการอื่น ๆ
131 c++  c  linux  gcc  include-path 

12
เหตุใด C จึงไม่มีลอยที่ไม่ได้ลงชื่อ
ฉันรู้ว่าคำถามดูเหมือนจะแปลก โปรแกรมเมอร์บางครั้งก็คิดมากเกินไป โปรดอ่านต่อ ... ใน CI ใช้signedและunsignedจำนวนเต็มมาก ฉันชอบข้อเท็จจริงที่ว่าคอมไพลเลอร์เตือนฉันหากฉันทำสิ่งต่างๆเช่นการกำหนดจำนวนเต็มที่เซ็นชื่อให้กับตัวแปรที่ไม่ได้ลงชื่อ ฉันได้รับคำเตือนหากเปรียบเทียบเซ็นกับจำนวนเต็มที่ไม่ได้ลงชื่อและอื่น ๆ อีกมากมาย ฉันชอบคำเตือนเหล่านี้ พวกเขาช่วยฉันรักษารหัสของฉันให้ถูกต้อง ทำไมเราไม่มีความหรูหราเหมือนกันสำหรับลอย? รากที่สองจะไม่ส่งกลับจำนวนลบอย่างแน่นอน มีสถานที่อื่น ๆ เช่นกันที่ค่าการลอยตัวเชิงลบไม่มีความหมาย ตัวเลือกที่สมบูรณ์แบบสำหรับการลอยตัวที่ไม่ได้ลงนาม Btw - ฉันไม่ค่อยสนใจเกี่ยวกับความแม่นยำพิเศษเพียงเล็กน้อยที่ฉันจะได้รับโดยการลบบิตเครื่องหมายออกจากโฟลต ฉันมีความสุขมากกับfloatพวกเขาในขณะนี้ ฉันแค่อยากจะทำเครื่องหมายลอยว่าไม่ได้ลงนามในบางครั้งและรับคำเตือนแบบเดียวกับที่ฉันได้รับจากจำนวนเต็ม ฉันไม่ทราบภาษาโปรแกรมใด ๆ ที่รองรับตัวเลขทศนิยมที่ไม่ได้ลงชื่อ มีความคิดว่าทำไมพวกเขาถึงไม่มี? แก้ไข: ฉันรู้ว่า x87 FPU ไม่มีคำแนะนำในการจัดการกับการลอยตัวที่ไม่ได้ลงชื่อ ให้ใช้คำแนะนำลอยที่ลงนาม การใช้ผิดประเภท (เช่นต่ำกว่าศูนย์) อาจถือได้ว่าเป็นพฤติกรรมที่ไม่ได้กำหนดในลักษณะเดียวกับที่ไม่มีการกำหนดจำนวนเต็มที่มีการลงนามมากเกินไป

17
“ #include” ไฟล์ข้อความในโปรแกรม C เป็นอักขระ []
มีวิธีการรวมไฟล์ข้อความทั้งหมดเป็นสตริงในโปรแกรม C ที่รวบรวมเวลาหรือไม่ สิ่งที่ต้องการ: file.txt: This is a little text file main.c: #include <stdio.h> int main(void) { #blackmagicinclude("file.txt", content) /* equiv: char[] content = "This is\na little\ntext file"; */ printf("%s", content); } การรับโปรแกรมเล็ก ๆ ที่พิมพ์บน stdout "นี่คือไฟล์ข้อความเล็ก ๆ " ตอนนี้ฉันใช้สคริปต์ python ที่แฮ็ค แต่มันน่าเกลียดและ จำกัด ชื่อตัวแปรเพียงชื่อเดียวคุณช่วยบอกวิธีอื่นให้ฉันได้ไหม

5
ฉันจะสร้าง makefile อย่างง่ายสำหรับ gcc บน Linux ได้อย่างไร
ฉันมีสามไฟล์: program.c, และprogram.hheaders.h program.cรวมถึงและprogram.hheaders.h ฉันต้องการคอมไพล์ไฟล์นี้บน Linux โดยใช้gcc compiler ฉันไม่แน่ใจว่าจะทำอย่างไร Netbeans สร้างขึ้นมาสำหรับฉัน แต่มันว่างเปล่า
130 c  gcc  makefile 


14
เหตุใดตัวชี้ฟังก์ชันและตัวชี้ข้อมูลจึงไม่เข้ากันใน C / C ++
ฉันได้อ่านพบว่าการแปลงตัวชี้ฟังก์ชันเป็นตัวชี้ข้อมูลและในทางกลับกันใช้งานได้กับแพลตฟอร์มส่วนใหญ่ แต่ไม่รับประกันว่าจะใช้งานได้ เหตุใดจึงเป็นเช่นนี้ ทั้งสองไม่ควรเป็นเพียงที่อยู่ในหน่วยความจำหลักดังนั้นจึงเข้ากันได้?

8
ประกาศตำแหน่งตัวแปรใน C
ฉันคิดมานานแล้วว่าใน C ตัวแปรทั้งหมดจะต้องถูกประกาศในตอนเริ่มต้นของฟังก์ชัน ฉันรู้ว่าใน C99 กฎเหมือนกันใน C ++ แต่อะไรคือกฎการวางประกาศตัวแปรสำหรับ C89 / ANSI C โค้ดต่อไปนี้คอมไพล์ด้วยgcc -std=c89และgcc -ansi: #include <stdio.h> int main() { int i; for (i = 0; i < 10; i++) { char c = (i % 95) + 32; printf("%i: %c\n", i, c); char *s; s = "some string"; …
129 c  declaration  c89 

6
บัฟเฟอร์ recv ของฉันควรใหญ่แค่ไหนเมื่อเรียก recv ในไลบรารีซ็อกเก็ต
ฉันมีคำถามสองสามข้อเกี่ยวกับซ็อกเก็ตไลบรารี่ในซีนี่คือตัวอย่างของโค้ดที่ฉันจะอ้างถึงในคำถามของฉัน char recv_buffer[3000]; recv(socket, recv_buffer, 3000, 0); ฉันจะตัดสินใจได้อย่างไรว่าจะสร้าง recv_buffer ขนาดใหญ่ได้อย่างไร ฉันใช้ 3000 แต่มันไม่มีข้อ จำกัด จะเกิดอะไรขึ้นหากrecv()ได้รับแพ็คเก็ตที่ใหญ่กว่าบัฟเฟอร์ของฉัน ฉันจะรู้ได้อย่างไรว่าฉันได้รับข้อความทั้งหมดโดยไม่ต้องโทร recv อีกครั้งและรอมันตลอดไปเมื่อไม่มีอะไรจะได้รับ? มีวิธีที่ฉันสามารถสร้างบัฟเฟอร์ไม่ได้มีพื้นที่จำนวนคงที่เพื่อให้ฉันสามารถเพิ่มไปเรื่อย ๆ โดยไม่ต้องกลัวที่จะหมดพื้นที่? อาจใช้strcatเพื่อเชื่อมการrecv()ตอบสนองล่าสุดกับบัฟเฟอร์หรือไม่ ฉันรู้ว่ามันเป็นคำถามจำนวนมากในหนึ่งเดียว แต่ฉันจะขอบคุณคำตอบอย่างมาก
129 c  sockets  buffer  recv 

6
ทำไมจำนวนเต็มล้นใน x86 กับ GCC ทำให้เกิดการวนซ้ำไม่สิ้นสุด?
รหัสต่อไปนี้จะเข้าสู่วงวนไม่สิ้นสุดบน GCC: #include <iostream> using namespace std; int main(){ int i = 0x10000000; int c = 0; do{ c++; i += i; cout << i << endl; }while (i > 0); cout << c << endl; return 0; } ดังนั้นนี่คือข้อตกลง: การล้นจำนวนเต็มที่ลงนามคือพฤติกรรมที่ไม่ได้กำหนดทางเทคนิค แต่ GCC บน x86 ใช้เลขคณิตจำนวนเต็มโดยใช้คำแนะนำจำนวนเต็ม x86 - ซึ่งตัดกับโอเวอร์โฟลว์ ดังนั้นฉันคาดหวังว่ามันจะห่อหุ้มด้วยน้ำล้น …
129 c++  c  gcc  x86  undefined-behavior 

15
แนวคิดของตัวชี้โมฆะในการเขียนโปรแกรม C
เป็นไปได้หรือไม่ที่จะตรวจสอบตัวชี้โมฆะโดยไม่ต้องใช้การพิมพ์ในภาษาโปรแกรม C? นอกจากนี้มีวิธีการทั่วไปฟังก์ชั่นที่สามารถรับตัวชี้และเก็บไว้ในโมฆะตัวชี้และโดยใช้ตัวชี้โมฆะนั้นเราสามารถทำฟังก์ชั่นทั่วไป? สำหรับเช่น: void abc(void *a, int b) { if(b==1) printf("%d",*(int*)a); // If integer pointer is received else if(b==2) printf("%c",*(char*)a); // If character pointer is received else if(b==3) printf("%f",*(float*)a); // If float pointer is received } ฉันต้องการทำให้ฟังก์ชั่นนี้เป็นแบบทั่วไปโดยไม่ต้องใช้คำสั่ง if-else - เป็นไปได้ไหม? นอกจากนี้หากมีบทความทางอินเทอร์เน็ตที่ดีซึ่งอธิบายแนวคิดของตัวชี้โมฆะมันจะมีประโยชน์ถ้าคุณสามารถระบุ URL ได้ นอกจากนี้การคำนวณทางคณิตศาสตร์ด้วยพอยน์เตอร์พอยน์เตอร์จึงเป็นไปได้หรือไม่?
129 c  void-pointers 

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