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

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

13
วิธีค้นหา 'sizeof' (ตัวชี้ที่ชี้ไปยังอาร์เรย์)
ก่อนอื่นนี่คือรหัสบางส่วน: int main() { int days[] = {1,2,3,4,5}; int *ptr = days; printf("%u\n", sizeof(days)); printf("%u\n", sizeof(ptr)); return 0; } มีวิธีการหาขนาดของอาเรย์ที่ptrชี้ไป (แทนที่จะแค่ให้ขนาดของมันซึ่งเป็นสี่ไบต์บนระบบ 32 บิต)?
309 c  arrays  pointers  sizeof 

11
ความแตกต่างระหว่าง NULL, '\ 0' และ 0 คืออะไร?
ใน C มีปรากฏเป็นความแตกต่างระหว่างค่าต่างๆของศูนย์ - NULL, และNUL0 ฉันรู้ว่าอักขระ ASCII '0'ประเมินหรือ480x30 NULLชี้มักจะถูกกำหนดให้เป็น: #define NULL 0 หรือ #define NULL (void *)0 นอกจากนี้ยังมีNULตัวละคร'\0'ที่ดูเหมือนว่าจะประเมิน0เช่นกัน มีบางครั้งที่ค่าสามค่านี้ไม่สามารถเท่ากันได้หรือไม่? สิ่งนี้เป็นจริงในระบบ 64 บิตหรือไม่
309 c  pointers  null 

8
ทำไมแรนด์ () + แรนด์ () สร้างจำนวนลบ?
ฉันสังเกตเห็นว่าrand()ฟังก์ชั่นห้องสมุดเมื่อมันถูกเรียกเพียงครั้งเดียวภายในวงมันมักจะสร้างตัวเลขที่เป็นบวก for (i = 0; i < 100; i++) { printf("%d\n", rand()); } แต่เมื่อฉันเพิ่มสองrand()สายหมายเลขที่สร้างในขณะนี้จะมีจำนวนลบมากกว่า for (i = 0; i < 100; i++) { printf("%d = %d\n", rand(), (rand() + rand())); } บางคนสามารถอธิบายได้ว่าทำไมฉันจึงเห็นตัวเลขติดลบในกรณีที่สอง? PS: srand(time(NULL))ผมเริ่มต้นเมล็ดพันธุ์ก่อนที่จะห่วงเป็น
304 c  random 

20
เหตุใดฉันจึงควรเปิดใช้งานคำเตือนคอมไพเลอร์เสมอ
ฉันมักจะได้ยินว่าเมื่อรวบรวมโปรแกรม C และ C ++ ฉันควร "เปิดใช้งานคำเตือนคอมไพเลอร์" เสมอ ทำไมถึงจำเป็น ฉันจะทำอย่างไร บางครั้งฉันก็ได้ยินว่าฉันควร "ถือว่าคำเตือนเป็นข้อผิดพลาด" ฉันควร? ฉันจะทำอย่างไร


5
การแตกบิตด้วยการคูณเดียว
ผมเห็นเป็นเทคนิคที่น่าสนใจนำมาใช้ในการให้คำตอบให้กับคำถามอื่นและต้องการที่จะเข้าใจมันเล็ก ๆ น้อย ๆ ที่ดีกว่า เราได้รับจำนวนเต็ม 64- บิตที่ไม่ได้ลงชื่อและเราสนใจบิตต่อไปนี้: 1.......2.......3.......4.......5.......6.......7.......8....... โดยเฉพาะเราต้องการย้ายพวกเขาไปยังตำแหน่งแปดอันดับแรกเช่น: 12345678........................................................ เราไม่สนใจเกี่ยวกับคุณค่าของบิตที่ระบุโดย.และพวกเขาไม่จำเป็นต้องเก็บรักษาไว้ วิธีการแก้ปัญหา0x2040810204081คือการหน้ากากออกบิตที่ไม่พึงประสงค์และคูณผลโดย นี่เป็นเคล็ดลับ วิธีนี้เป็นวิธีทั่วไป? สามารถใช้เทคนิคนี้เพื่อแยกบิตย่อยใด ๆ ได้หรือไม่? ถ้าไม่วิธีหนึ่งคิดออกว่าวิธีการทำงานสำหรับชุดบิตเฉพาะหรือไม่ สุดท้ายเราจะหาตัวคูณที่ถูกต้องเพื่อแยกบิตที่กำหนดได้อย่างไร

3
ทำไม NaN - NaN == 0.0 กับ Intel C ++ Compiler
เป็นที่ทราบกันดีว่า NaNs เผยแพร่เลขคณิต แต่ฉันไม่พบการสาธิตดังนั้นฉันจึงเขียนการทดสอบเล็กน้อย: #include <limits> #include <cstdio> int main(int argc, char* argv[]) { float qNaN = std::numeric_limits<float>::quiet_NaN(); float neg = -qNaN; float sub1 = 6.0f - qNaN; float sub2 = qNaN - 6.0f; float sub3 = qNaN - qNaN; float add1 = 6.0f + qNaN; float add2 = qNaN …
300 c++  c  floating-point  ieee-754  icc 

6
นิยามแปลก ๆ ของมาโคร TRUE และ FALSE
ฉันได้เห็นคำจำกัดความของแมโครดังต่อไปนี้ในหนังสือการเข้ารหัส #define TRUE '/'/'/' #define FALSE '-'-'-' ไม่มีคำอธิบายที่นั่น กรุณาอธิบายให้ฉันวิธีการเหล่านี้จะทำงานเป็นและTRUEFALSE
300 c++  c  macros  boolean  obfuscation 

14
ต่ำสุดและสูงสุดเป็น c
อยู่ที่ไหนMINและMAXกำหนดไว้ใน C ถ้าทั้งหมด? เป็นวิธีที่ดีที่สุดในการใช้สิ่งเหล่านี้โดยทั่วไปและพิมพ์อย่างปลอดภัยที่สุดเท่าที่จะทำได้? (ส่วนขยายคอมไพเลอร์ / บิวอินสำหรับคอมไพเลอร์หลักที่ต้องการ)
299 c  max  min  c-preprocessor 

4
ขนาดของอักขระ ('a') ใน C / C ++
ขนาดของตัวละครใน C และ C ++ คืออะไร? เท่าที่ฉันรู้ขนาดของถ่านเท่ากับ 1 ไบต์ทั้งใน C และ C ++ ใน C: #include <stdio.h> int main() { printf("Size of char : %d\n", sizeof(char)); return 0; } ใน C ++: #include <iostream> int main() { std::cout << "Size of char : " << sizeof(char) << "\n"; return 0; …
298 c++  c  types 

9
พอยน์เตอร์ใน C: ควรใช้เครื่องหมายและเครื่องหมายดอกจันเมื่อใด
ฉันเพิ่งเริ่มต้นด้วยตัวชี้และฉันสับสนเล็กน้อย ฉันรู้ว่า&หมายถึงที่อยู่ของตัวแปรและ*สามารถใช้ด้านหน้าของตัวแปรตัวชี้เพื่อรับค่าของวัตถุที่ถูกชี้โดยตัวชี้ แต่สิ่งต่าง ๆ จะทำงานแตกต่างกันเมื่อคุณทำงานกับอาร์เรย์สตริงหรือเมื่อคุณเรียกใช้ฟังก์ชันด้วยสำเนาของตัวแปร เป็นการยากที่จะเห็นรูปแบบของตรรกะภายในทั้งหมดนี้ เมื่อฉันควรใช้&และ*?
298 c  pointers 

6
วิธีพิมพ์ int64_t ในซี
C99 มาตรฐานมีประเภทจำนวนเต็มที่มีขนาดไบต์เช่น int64_t ฉันใช้รหัสต่อไปนี้: #include <stdio.h> #include <stdint.h> int64_t my_int = 999999999999999999; printf("This is my_int: %I64d\n", my_int); และฉันได้รับคำเตือนคอมไพเลอร์นี้: warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’ ฉันลองด้วย: printf("This is my_int: %lld\n", my_int); // long long decimal แต่ฉันได้รับคำเตือนเดียวกัน ฉันใช้คอมไพเลอร์นี้: ~/dev/c$ cc -v Using built-in specs. Target: i686-apple-darwin10 …
298 c  stdint 

26
วัดเวลาที่ผ่านไปได้อย่างง่ายดาย
ฉันกำลังพยายามใช้เวลา ()เพื่อวัดจุดต่าง ๆ ของโปรแกรมของฉัน สิ่งที่ฉันไม่เข้าใจคือเหตุผลที่ค่าในก่อนและหลังเหมือนกันหรือไม่ ฉันเข้าใจว่านี่ไม่ใช่วิธีที่ดีที่สุดในการจัดทำโปรไฟล์โปรแกรมของฉันฉันแค่ต้องการดูว่าใช้เวลานานเท่าใด printf("**MyProgram::before time= %ld\n", time(NULL)); doSomthing(); doSomthingLong(); printf("**MyProgram::after time= %ld\n", time(NULL)); ฉันเหนื่อย: struct timeval diff, startTV, endTV; gettimeofday(&startTV, NULL); doSomething(); doSomethingLong(); gettimeofday(&endTV, NULL); timersub(&endTV, &startTV, &diff); printf("**time taken = %ld %ld\n", diff.tv_sec, diff.tv_usec); ฉันจะอ่านผลลัพธ์ได้**time taken = 0 26339อย่างไร นั่นหมายความว่า nanoseconds 26,339 = 26.3 มิลลิวินาที สิ่งที่เกี่ยวกับ**time …
297 c++  c  linux  time  measurement 

3
ตัวดำเนินการ >>> = ใน C คืออะไร
ได้รับจากเพื่อนร่วมงานเป็นตัวต่อฉันไม่สามารถเข้าใจได้ว่าโปรแกรม C นี้รวบรวมและใช้งานได้อย่างไร >>>=ตัวดำเนินการนี้และ1P1ตัวอักษรแปลกคืออะไร ฉันได้ทำการทดสอบใน Clang และ GCC แล้ว ไม่มีคำเตือนและผลลัพธ์คือ "???" #include <stdio.h> int main() { int a[2]={ 10, 1 }; while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] ) printf("?"); return 0; }

11
ค่าสูงสุดของจำนวนเต็ม
ใน C จำนวนเต็ม (สำหรับเครื่อง 32 บิต) คือ 32 บิตและมีค่าตั้งแต่ -32,768 ถึง +32,767 ใน Java ค่าจำนวนเต็ม (ยาว) ก็มี 32 บิต แต่มีค่าตั้งแต่ -2,147,483,648 ถึง +2,147,483,647 ฉันไม่เข้าใจว่าช่วงแตกต่างใน Java ได้อย่างไรแม้ว่าจำนวนบิตจะเท่ากัน มีคนอธิบายเรื่องนี้ได้ไหม
291 java  c  integer  max  bit 

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