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

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

3
เหตุใด GCC จึงสร้างแอสเซมบลีที่ต่างกันอย่างสิ้นเชิงสำหรับรหัส C เกือบเหมือนกัน
ในขณะที่เขียนเพิ่มประสิทธิภาพftolการทำงานของผมพบว่าพฤติกรรมแปลก ๆ GCC 4.6.1บางอย่างใน ให้ฉันแสดงรหัสก่อน (เพื่อความชัดเจนฉันได้ทำเครื่องหมายความแตกต่าง): fast_trunc_one, C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 - ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff …

8
การเรียกระบบ brk () ทำหน้าที่อะไร?
ตามคู่มือโปรแกรมเมอร์ Linux: brk () และ sbrk () เปลี่ยนตำแหน่งของตัวแบ่งโปรแกรมซึ่งกำหนดจุดสิ้นสุดของส่วนข้อมูลของกระบวนการ ส่วนข้อมูลหมายถึงอะไรที่นี่ เป็นเพียงส่วนข้อมูลหรือข้อมูล BSS และฮีปรวมกันหรือไม่ ตามวิกิ: บางครั้งข้อมูลพื้นที่ BSS และกองรวมเรียกว่า "ส่วนข้อมูล" ฉันไม่เห็นเหตุผลที่จะเปลี่ยนขนาดของกลุ่มข้อมูล ถ้าเป็นข้อมูลBSSและกองรวมกันมันก็สมเหตุสมผลแล้วเพราะกองจะได้พื้นที่มากขึ้น ซึ่งนำฉันไปที่คำถามที่สองของฉัน ในบทความทั้งหมดที่ฉันอ่านจนถึงตอนนี้ผู้เขียนบอกว่ากองเติบโตขึ้นและกองทับลง แต่สิ่งที่พวกเขาไม่อธิบายก็คือจะเกิดอะไรขึ้นเมื่อฮีปใช้พื้นที่ทั้งหมดระหว่างฮีปกับสแต็ค
184 c  linux  unix  memory-management  brk 

16
C อ่านไฟล์ทีละบรรทัด
ฉันเขียนฟังก์ชันนี้เพื่ออ่านบรรทัดจากไฟล์: const char *readLine(FILE *file) { if (file == NULL) { printf("Error: file pointer is null."); exit(1); } int maximumLineLength = 128; char *lineBuffer = (char *)malloc(sizeof(char) * maximumLineLength); if (lineBuffer == NULL) { printf("Error allocating memory for line buffer."); exit(1); } char ch = getc(file); int count = 0; …
184 c  file-io  line  std 


8
การใช้มาโครมากเกินไปในจำนวนอาร์กิวเมนต์
ฉันมีมาโครสองตัวFOO2และFOO3: #define FOO2(x,y) ... #define FOO3(x,y,z) ... ฉันต้องการกำหนดแมโครใหม่FOOดังนี้: #define FOO(x,y) FOO2(x,y) #define FOO(x,y,z) FOO3(x,y,z) แต่วิธีนี้ใช้ไม่ได้เนื่องจากมาโครไม่ทำงานเกินจำนวนอาร์กิวเมนต์ หากไม่มีการแก้ไขFOO2และFOO3มีวิธีกำหนดแมโครFOO(ใช้__VA_ARGS__หรือไม่เช่นนั้น) เพื่อให้ได้ผลการเยี่ยงเดียวFOO(x,y)กับFOO2และFOO(x,y,z)เพื่อFOO3?
183 c  macros  c-preprocessor 

22
ภาษาแอสเซมบลีแบบอินไลน์ช้ากว่ารหัสภาษา C ++ หรือไม่
ฉันพยายามเปรียบเทียบประสิทธิภาพของภาษาแอสเซมบลีแบบอินไลน์และรหัส C ++ ดังนั้นฉันจึงเขียนฟังก์ชั่นที่เพิ่มขนาด 2,000 อาร์เรย์สองอาร์เรย์เป็น 100,000 ครั้ง นี่คือรหัส: #define TIMES 100000 void calcuC(int *x,int *y,int length) { for(int i = 0; i < TIMES; i++) { for(int j = 0; j < length; j++) x[j] += y[j]; } } void calcuAsm(int *x,int *y,int lengthOfArray) { __asm { mov edi,TIMES …
183 c++  c  performance  assembly 

2
ใช้งานจริงของคำหลัก 'จำกัด ' C99?
ฉันกำลังอ่านเอกสารและคำถาม / คำตอบและเห็นมันกล่าวถึง ฉันอ่านคำอธิบายสั้น ๆ โดยระบุว่าโดยทั่วไปแล้วมันจะเป็นสัญญาจากโปรแกรมเมอร์ว่าจะไม่ใช้ตัวชี้ชี้ไปที่อื่น มีใครบ้างที่สามารถเสนอกรณีที่เป็นจริงได้ซึ่งคุ้มค่ากับการใช้งานจริงหรือไม่?
183 c  gcc  c99  restrict-qualifier 

4
ฉันจะใช้ valgrind เพื่อค้นหาหน่วยความจำรั่วได้อย่างไร
ฉันจะใช้ valgrind เพื่อค้นหาหน่วยความจำรั่วในโปรแกรมได้อย่างไร โปรดใครสักคนช่วยฉันและอธิบายขั้นตอนในการดำเนินการตามขั้นตอนหรือไม่ ฉันใช้ Ubuntu 10.04 และฉันมีโปรแกรมa.cโปรดช่วยฉันด้วย
183 c  valgrind 

10
เหตุใดฟังก์ชันตัวแปรเงื่อนไขของ pthreads จึงจำเป็นต้องมี mutex
ฉันอ่านบนpthread.h; ฟังก์ชันเงื่อนไขที่เกี่ยวข้องกับตัวแปร (เช่นpthread_cond_wait(3)) ต้องการ mutex เป็นอาร์กิวเมนต์ ทำไม? เท่าที่ผมสามารถบอกได้ว่าผมจะได้รับการสร้าง mutex เพียงเพื่อใช้เป็นข้อโต้แย้งที่? Mutex นั้นควรทำอะไร?

8
ฉันจะเปรียบเทียบสตริงได้อย่างถูกต้องได้อย่างไร
ฉันพยายามรับโปรแกรมเพื่อให้ผู้ใช้ป้อนคำหรือตัวอักษรเก็บไว้แล้วพิมพ์จนกระทั่งผู้ใช้พิมพ์อีกครั้งออกจากโปรแกรม รหัสของฉันมีลักษณะเช่นนี้: #include <stdio.h> int main() { char input[40]; char check[40]; int i=0; printf("Hello!\nPlease enter a word or character:\n"); gets(input); printf("I will now repeat this until you type it back to me.\n"); while (check != input) { printf("%s\n", input); gets(check); } printf("Good bye!"); return 0; } ปัญหาคือฉันได้รับการพิมพ์ของสายป้อนข้อมูลแม้ในขณะที่การป้อนข้อมูลโดยผู้ใช้ (ตรวจสอบ) ตรงกับต้นฉบับ (อินพุต) …
182 c  string  strcmp 

6
ฉันจะกำหนดและใช้ ENUM ใน Objective-C ได้อย่างไร
ฉันประกาศ enum ในไฟล์การใช้งานของฉันตามที่แสดงด้านล่างและประกาศตัวแปรประเภทนั้นในส่วนต่อประสานของฉันเป็น PlayerState thePlayerState; และใช้ตัวแปรในวิธีการของฉัน แต่ฉันได้รับข้อผิดพลาดที่ระบุว่าไม่ได้ประกาศ ฉันจะประกาศอย่างถูกต้องและใช้ตัวแปรประเภท PlayerState ในวิธีการของฉันได้อย่างไร: ในไฟล์. m @implementation View1Controller typedef enum playerStateTypes { PLAYER_OFF, PLAYER_PLAYING, PLAYER_PAUSED } PlayerState; ในไฟล์. h: @interface View1Controller : UIViewController { PlayerState thePlayerState; ในวิธีการบางอย่างในไฟล์. m: -(void)doSomethin{ thePlayerState = PLAYER_OFF; }
180 iphone  objective-c  c 

16
ตัวแปรสแตติกเก็บไว้ที่ไหนใน C และ C ++
ในส่วนใด (.BSS, .DATA, อื่น ๆ ) ของไฟล์ที่เรียกใช้งานเป็นตัวแปรสแตติกที่เก็บไว้เพื่อไม่ให้มีการชนกันของชื่อ? ตัวอย่างเช่น: foo.c: bar.c: static int foo = 1; static int foo = 10; void fooTest() { void barTest() { static int bar = 2; static int bar = 20; foo++; foo++; bar++; bar++; printf("%d,%d", foo, bar); printf("%d, %d", foo, bar); } } หากฉันรวบรวมทั้งไฟล์และเชื่อมโยงไปยังไฟล์หลักที่เรียกใช้ …

5
ทำไม scanf () ต้องการ“% lf” เป็นสองเท่าเมื่อ printf () ไม่เป็นไรด้วยเพียงแค่“% f”
ทำไมมันจึงเป็นที่scanf()ต้องการlใน " %lf" เมื่ออ่านdoubleเมื่อprintf()สามารถใช้ " %f" โดยไม่คำนึงว่าอาร์กิวเมนต์เป็นdoubleหรือfloat? รหัสตัวอย่าง: double d; scanf("%lf", &d); printf("%f", d);

30
ฉันจะตัดช่องว่างนำหน้า / ต่อท้ายด้วยวิธีมาตรฐานได้อย่างไร
มีวิธีการที่สะอาดและเป็นมาตรฐานโดยเฉพาะในการตัดส่วนที่นำหน้าและช่องว่างต่อท้ายจากสตริงใน C หรือไม่? ฉันจะกลิ้งของตัวเอง แต่ฉันจะคิดว่านี่เป็นปัญหาที่พบบ่อยกับการแก้ปัญหาที่พบบ่อยเท่าเทียมกัน
178 c  string  whitespace  trim 

10
สลับคำสั่ง: ค่าเริ่มต้นจะต้องเป็นกรณีสุดท้ายหรือไม่
พิจารณาข้อความต่อไปนี้switch: switch( value ) { case 1: return 1; default: value++; // fall-through case 2: return value * 2; } รหัสนี้จะรวบรวม แต่มันถูกต้อง (= พฤติกรรมที่กำหนด) สำหรับ C90 / C99? ฉันไม่เคยเห็นรหัสที่กรณีเริ่มต้นไม่ใช่กรณีสุดท้าย แก้ไข: ตามที่Jon CageและKillianDSเขียน: นี่เป็นโค้ดที่น่าเกลียดและสับสนและฉันก็รู้ดี ฉันแค่สนใจในไวยากรณ์ทั่วไป (มันถูกกำหนดหรือไม่) และผลลัพธ์ที่คาดหวัง

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