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

C เป็นภาษาโปรแกรมคอมพิวเตอร์ทั่วไปที่ใช้สำหรับระบบปฏิบัติการเกมและงานที่มีประสิทธิภาพสูงอื่น ๆ

10
การ“ กำหนดค่าเริ่มต้นตัวแปรเสมอ” นำไปสู่ข้อบกพร่องสำคัญที่ถูกซ่อนอยู่หรือไม่
หลักเกณฑ์ C ++ Core มีกฎES.20: เริ่มต้นวัตถุเสมอ หลีกเลี่ยงข้อผิดพลาดที่ใช้ก่อนกำหนดและพฤติกรรมที่ไม่ได้กำหนดไว้ หลีกเลี่ยงปัญหาเกี่ยวกับความเข้าใจในการเริ่มต้นที่ซับซ้อน ลดความซับซ้อนของการ refactoring แต่กฎนี้ไม่ได้ช่วยในการค้นหาข้อบกพร่องมันเพียงซ่อนพวกเขา สมมติว่าโปรแกรมมีพา ธ การประมวลผลซึ่งใช้ตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น มันเป็นข้อผิดพลาด พฤติกรรมที่ไม่ได้กำหนดไว้นอกจากนี้ยังหมายความว่ามีบางอย่างผิดปกติและโปรแกรมอาจไม่ตรงตามข้อกำหนดของผลิตภัณฑ์ เมื่อมันถูกนำไปใช้กับการผลิตอาจมีการสูญเสียเงินหรือแย่ลง เราจะตรวจสอบข้อบกพร่องได้อย่างไร เราเขียนแบบทดสอบ แต่การทดสอบไม่ครอบคลุมเส้นทางการดำเนินการ 100% และการทดสอบจะไม่ครอบคลุม 100% ของอินพุตโปรแกรม ยิ่งไปกว่านั้นแม้การทดสอบจะครอบคลุมเส้นทางการดำเนินการที่ผิดปกติ แต่ก็ยังสามารถผ่านได้ มันไม่ได้กำหนดพฤติกรรมหลังจากทั้งหมดตัวแปร uninitialized สามารถมีค่าที่ค่อนข้างถูกต้อง แต่นอกเหนือจากการทดสอบของเราเรามีคอมไพเลอร์ที่สามารถเขียนอะไรบางอย่างเช่น 0xCDCDCDCD ไปยังตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น สิ่งนี้จะช่วยปรับปรุงอัตราการตรวจจับของการทดสอบเล็กน้อย ยิ่งไปกว่านั้น - มีเครื่องมือเช่น Address Sanitizer ที่จะอ่านค่าหน่วยความจำที่ไม่ได้กำหนดค่าเริ่มต้นทั้งหมด และในที่สุดก็มีเครื่องวิเคราะห์แบบสแตติกซึ่งสามารถดูโปรแกรมและบอกว่ามีการอ่านก่อนตั้งค่าบนพา ธ การเรียกใช้งานนั้น ดังนั้นเราจึงมีเครื่องมือที่ทรงพลังมากมาย แต่ถ้าเราเริ่มต้นตัวแปร - sanitizers ไม่พบอะไรเลย int bytes_read = …
34 c++  c 

8
เหตุใด Clang / LLVM จึงเตือนฉันเกี่ยวกับการใช้ค่าเริ่มต้นในคำสั่ง switch ที่ครอบคลุมทุกกรณีที่แจกแจง?
พิจารณาคำสั่ง enum และ switch ต่อไปนี้: typedef enum { MaskValueUno, MaskValueDos } testingMask; void myFunction(testingMask theMask) { switch (theMask) { case MaskValueUno: {}// deal with it case MaskValueDos: {}// deal with it default: {} //deal with an unexpected or uninitialized value } }; ฉันเป็นโปรแกรมเมอร์ Objective-C แต่ฉันเขียนสิ่งนี้ใน C บริสุทธิ์สำหรับผู้ชมที่กว้างขึ้น Clang / LLVM …

5
เมื่อไหร่ที่จะต้องรวบรวมภาษาของตัวเองเป็นรหัส C ก่อน?
เมื่อออกแบบภาษาการเขียนโปรแกรมของตัวเองมันจะเหมาะสมที่จะเขียนตัวแปลงที่ใช้ซอร์สโค้ดและแปลงเป็นรหัส C หรือ C ++ เพื่อให้ฉันสามารถใช้คอมไพเลอร์ที่มีอยู่เช่น gcc เพื่อจบด้วยรหัสเครื่อง? มีโครงการที่ใช้วิธีนี้หรือไม่?

8
ทำไม Java ไม่อนุญาตให้ใช้เงื่อนไขตัวเลขเช่นถ้า (5) {…} ถ้า C ทำ?
ฉันมีโปรแกรมเล็ก ๆ สองโปรแกรมนี้: C #include <stdio.h> int main() { if (5) { printf("true\n"); } else { printf("false\n"); } return 0; } ชวา class type_system { public static void main(String args[]) { if (5) { System.out.println("true"); } else { System.out.println("false"); } } } ซึ่งรายงานข้อผิดพลาด: type_system.java:4: error: incompatible types: int cannot be …
33 java  c  type-systems 

5
ฉันควรเริ่มต้น C structs ผ่านพารามิเตอร์หรือโดยค่าตอบแทน? [ปิด]
บริษัท ที่ฉันทำงานอยู่นั้นกำลังเริ่มต้นโครงสร้างข้อมูลทั้งหมดผ่านฟังก์ชันเตรียมใช้งานเช่น: //the structure typedef struct{ int a,b,c; } Foo; //the initialize function InitializeFoo(Foo* const foo){ foo->a = x; //derived here based on other data foo->b = y; //derived here based on other data foo->c = z; //derived here based on other data } //initializing the structure Foo foo; InitializeFoo(&foo); …

7
เขียนใน C เพื่อประสิทธิภาพ? [ปิด]
ฉันรู้ว่าฉันเคยได้ยินบ่อยๆว่า C มักจะมีข้อได้เปรียบด้านประสิทธิภาพมากกว่า C ++ ฉันไม่ได้คิดอย่างอื่นจนกว่าฉันจะรู้ว่า MSVC ดูเหมือนจะไม่สนับสนุนมาตรฐานใหม่ล่าสุดของ C แต่รุ่นล่าสุดรองรับ C99 (เท่าที่ฉันรู้) ฉันวางแผนที่จะเขียนไลบรารีด้วยโค้ดบางอย่างเพื่อให้แสดงผลใน OpenGL เพื่อให้ฉันสามารถนำมาใช้ซ้ำได้ ฉันวางแผนที่จะเขียนไลบรารีใน C เนื่องจากการเพิ่มประสิทธิภาพใด ๆ ก็ยินดีต้อนรับเมื่อมันมาถึงกราฟิก แต่มันจะคุ้มหรือไม่ รหัสที่ใช้ไลบรารีน่าจะเขียนใน C ++ และฉันต้องการรหัสใน C ++ โดยทั่วไป อย่างไรก็ตามถ้ามันสร้างความแตกต่างเล็กน้อยในการแสดงฉันก็น่าจะไปกับ C อาจสังเกตได้ว่าห้องสมุดนี้จะเป็นสิ่งที่ฉันจะใช้ในการทำงานกับ Windows / OS X / Linux และฉันอาจรวบรวมทุกอย่างโดยพื้นฐาน (MSVC สำหรับ Windows, Clang หรือ GCC สำหรับ OS X และ GCC สำหรับ …

11
typedefs และ #defines
เราทุกคนเคยใช้typedefและ#defineครั้งเดียวแน่นอน วันนี้ในขณะที่ทำงานกับพวกเขาฉันเริ่มไตร่ตรองในบางสิ่ง พิจารณาสถานการณ์ด้านล่าง 2 สถานการณ์เพื่อใช้intประเภทข้อมูลที่มีชื่ออื่น: typedef int MYINTEGER และ #define MYINTEGER int เช่นเดียวกับสถานการณ์ข้างต้นเราสามารถทำสิ่งต่าง ๆ ได้โดยใช้ #define และทำได้เช่นเดียวกันโดยใช้ typedef แม้ว่าวิธีการที่เราทำแบบเดียวกันอาจแตกต่างกันมาก #define ยังสามารถทำการกระทำของ MACRO ซึ่ง typedef ไม่สามารถทำได้ แม้ว่าเหตุผลพื้นฐานสำหรับการใช้งานนั้นแตกต่างกัน แต่การทำงานต่างกันอย่างไร เมื่อใดที่ควรจะเป็นที่ต้องการมากกว่ากันเมื่อทั้งสองสามารถใช้? อีกอย่างหนึ่งรับประกันได้ว่าจะเร็วกว่าสถานการณ์อื่นหรือไม่ (เช่น #define เป็นคำสั่งของตัวประมวลผลล่วงหน้าดังนั้นทุกอย่างจะทำเร็วกว่าการคอมไพล์หรือรันไทม์)

13
การเขียนโปรแกรมระดับต่ำ - มีอะไรให้ฉันบ้าง [ปิด]
เป็นเวลาหลายปีที่ฉันได้พิจารณาการขุดลงไปในสิ่งที่ฉันคิดว่าเป็นภาษา "ระดับต่ำ" สำหรับฉันนี่หมายถึง C และการชุมนุม อย่างไรก็ตามฉันยังไม่มีเวลาสำหรับเรื่องนี้และมันก็ไม่จำเป็นเลย ตอนนี้เพราะฉันไม่เห็นความจำเป็นที่จะเกิดขึ้นฉันรู้สึกว่าฉันควรจะกำหนดเวลาในการศึกษาหัวข้อหรือวางแผนตลอดไป ตำแหน่งของฉัน ในช่วง 4 ปีที่ผ่านมาฉันได้มุ่งเน้นไปที่ "เทคโนโลยีเว็บ" ซึ่งอาจเปลี่ยนแปลงได้และฉันเป็นผู้พัฒนาแอปพลิเคชันซึ่งไม่น่าจะเปลี่ยนแปลงได้ ในการพัฒนาแอพพลิเคชั่นฉันคิดว่าการใช้งานเป็นสิ่งที่สำคัญที่สุด คุณเขียนแอปพลิเคชันที่จะ "บริโภค" โดยผู้ใช้ ยิ่งแอปพลิเคชั่นเหล่านั้นใช้งานได้มากเท่าไหร่คุณก็ยิ่งสร้างมูลค่าได้มากขึ้นเท่านั้น เพื่อให้บรรลุการใช้งานที่ดีฉันเชื่อว่าสิ่งต่อไปนี้เป็นไปได้ การออกแบบที่ดีดี: คุณสมบัติที่ถึงผู้ใช้สามารถเข้าถึงได้ผ่านส่วนต่อประสานผู้ใช้ที่มีความคิดดี ความถูกต้อง : การออกแบบที่ดีที่สุดไม่คุ้มค่าอะไรเลยหากใช้ไม่ถูกต้อง ความยืดหยุ่น : แอปพลิเคชัน A ควรมีการพัฒนาอยู่ตลอดเวลาเพื่อให้ผู้ใช้ไม่จำเป็นต้องเปลี่ยนไปใช้แอปพลิเคชัน B อื่นที่มีคุณสมบัติใหม่ที่ A สามารถนำไปใช้ได้ แอปพลิเคชันที่แก้ไขปัญหาเดียวกันไม่ควรมีคุณสมบัติแตกต่างกัน แต่ใช้หลักปรัชญา ประสิทธิภาพการทำงาน : ประสิทธิภาพก่อให้เกิดประสบการณ์การใช้งานที่ดี แอปพลิเคชันตอบสนองต่อความนึกคิดเสมอและทำงานได้อย่างรวดเร็วพอสมควร (ขึ้นอยู่กับความถี่) มูลค่าของการปรับประสิทธิภาพให้ดีขึ้นกว่าจุดที่ผู้ใช้สงสัย ฉันคิดว่าการเขียนโปรแกรมระดับต่ำจะไม่ช่วยฉันยกเว้นเรื่องประสิทธิภาพ แต่การเขียนแอพทั้งหมดในภาษาระดับต่ำเพื่อประสิทธิภาพการทำงานก็คือการปรับให้เหมาะสมก่อนเวลาสำหรับฉัน คำถามของฉัน การเขียนโปรแกรมระดับต่ำสามารถสอนอะไรฉันได้ภาษาอื่นจะไม่สอนฉัน ฉันขาดอะไรบางอย่างหรือเป็นเพียงทักษะที่ใช้ในการพัฒนาแอพพลิเคชั่นน้อยมาก? โปรดเข้าใจว่าฉันไม่ได้ตั้งคำถามเกี่ยวกับคุณค่าของ C และชุดประกอบ เป็นเพียงแค่ในชีวิตประจำวันของฉันฉันมีความสุขมากที่ความสลับซับซ้อนทั้งหมดของโลกนั้นถูกแยกออกไปและจัดการให้ฉัน …

8
การใช้ Make ถือว่าล้าสมัยหรือไม่ [ปิด]
ดังนั้นฉันจึงเจอหลายความคิดเห็น / โพสต์ / อื่น ๆ เกี่ยวกับการสร้าง makefiles โดยตรงและมันเป็นเรื่องโง่ที่ต้องทำในปี 2015 ฉันรู้เครื่องมือต่าง ๆ เช่น CMake และฉันใช้ CMake บ่อยครั้งมาก CMake กำลังสร้าง Makefile ให้คุณและช่วยในการลบความน่าเบื่อของการทำมันด้วยตัวคุณเอง แน่นอนว่ามันเพิ่มคุณสมบัติที่ยอดเยี่ยมอื่น ๆ อีกมากมาย ... แต่มันก็ยังเป็น Makefile ในที่สุด ดังนั้นคำถามของฉันคือการพูดคุย 'ล้าสมัย' เกี่ยวกับการอ้างอิงถึงยูทิลิตี้ Make ทั้งหมดหรือเพียงแค่ความคิดในการเขียน Makefiles ของคุณเองหรือไม่ ฉันไม่ได้ใช้ IDE สำหรับการพัฒนา C / C ++ เลย (แค่ emacs) ดังนั้นฉันจึงเขียน Makefiles เสมอ ถ้า Make …
31 c++  c  builds  make  cmake 

2
ต้นกำเนิดของ C Preprocessor คืออะไร
ตัวประมวลผลล่วงหน้า C เชื่อมต่อกับ C แต่มีไวยากรณ์ที่แตกต่างอย่างสิ้นเชิงจากภาษาหลัก: ช่องว่างที่มีความสำคัญทางไวยากรณ์ (จุดสิ้นสุดของบรรทัดยกเลิกคำสั่งช่องว่างหลังจากแมโครกำหนดจุดเริ่มต้นของรายการการแทนที่) บล็อกที่ใช้คำหลักแทนที่จะเป็นบล็อกที่มีเครื่องหมายค้ำยันelifแทนelse if คำจำกัดความที่นำโดยคำหลักแทนการประกาศ - สะท้อน - ใช้ไม่มี=สำหรับการกำหนดค่า คำแนะนำของไวยากรณ์สตริงทางเลือก ( #include <>vs #include "") การประเมินผลที่ขี้เกียจ (จาก C, ชัด ๆ แต่6.10.3.1สามารถอ่านได้โดยอ้างถึงคำสั่งเฉพาะของการขยายตัวของแมโครเช่นกันในบางแห่งที่มีความสำคัญ) มันดูไม่เหมือน C เลย! ในทางเทคนิคแล้วมันเป็นภาษาของตัวเอง แต่มันถูกใช้เป็นส่วนสำคัญเกือบทั้งหมดของ C และดูเหมือนว่าแปลกมากที่มันจะไม่รวมเข้ากับ syntactically Wikipedia ไม่ได้พูดถึงประวัติของมัน Portland Pattern Repository ได้กล่าวถึงการผ่านแต่ไม่ได้มีรายละเอียดนอกเหนือจากข้อเท็จจริงที่ว่ามันถูกออกแบบโดยคนอื่นนอกเหนือจากส่วนที่เหลือของเว็บไซต์ C. Dennis Ritchie ที่มีประวัติของ C อาจมีคำตอบ แต่น่าเสียดายที่ไม่มี ใช้ได้อีกต่อไป ในฐานะที่เป็นเครื่องมือมาโครก็เห็นได้ชัดว่ามีความหมายแตกต่างกันมากจากภาษารันไทม์ซึ่งจะอธิบายบางอย่างที่แตกต่างกัน แต่ไม่ได้ด้านการออกแบบภาพ …
30 c  history  macros 

5
หากตัวเลขมีขนาดใหญ่เกินไปมันจะกระจายไปยังตำแหน่งหน่วยความจำถัดไปหรือไม่
ฉันได้รับการตรวจสอบการเขียนโปรแกรม C และมีเพียงสองสามสิ่งที่รบกวนฉัน ลองทำโค้ดนี้กันตัวอย่าง: int myArray[5] = {1, 2, 2147483648, 4, 5}; int* ptr = myArray; int i; for(i=0; i<5; i++, ptr++) printf("\n Element %d holds %d at address %p", i, myArray[i], ptr); ฉันรู้ว่า int สามารถมีค่าสูงสุดเป็นบวก 2,147,483,647 ดังนั้นเมื่อทำอย่างนั้นมันจะ "ล้น" ไปยังที่อยู่หน่วยความจำถัดไปซึ่งทำให้องค์ประกอบ 2 ปรากฏเป็น "-2147483648" ที่ที่อยู่นั้นหรือไม่ แต่นั่นก็ไม่สมเหตุสมผลเพราะในผลลัพธ์มันยังบอกว่าที่อยู่ถัดไปเก็บค่า 4 จากนั้น 5 ถ้าจำนวนที่หกไปยังที่อยู่ถัดไปนั่นจะไม่เปลี่ยนค่าที่เก็บไว้ที่ที่อยู่นั้น ? …

10
ข้อมูล "ประเภท" ของตัวชี้ที่เก็บไว้ในภาษา C คืออะไร
ฉันรู้ว่าพอยน์เตอร์เก็บที่อยู่ ฉันรู้ว่าประเภทของพอยน์เตอร์เป็นที่รู้จักกันโดยทั่วไปตาม "ประเภท" ของข้อมูลที่ชี้ไป แต่พอยน์เตอร์ยังคงเป็นตัวแปรและที่อยู่ที่เก็บไว้จะต้องมีข้อมูล "ประเภท" ตามข้อมูลของฉันที่อยู่ในรูปแบบเลขฐานสิบหก แต่ฉันก็ยังไม่รู้ว่าข้อมูล "ประเภท" คือเลขฐานสิบหกนี้ (โปรดทราบว่าฉันรู้ว่าเลขฐานสิบหกคืออะไร แต่เมื่อคุณพูด10CBA20เช่นสตริงของอักขระนี้คือจำนวนเต็มอะไรเมื่อฉันต้องการเข้าถึงที่อยู่และจัดการมัน .. ตัวเองฉันต้องรู้ประเภทของมัน คือเหตุผลที่ฉันถาม)
30 c  pointers 

12
int * i; หรือ int * i; หรือ int * i; [ปิด]
อะไรคือวิธีที่คุณชื่นชอบในการประกาศตัวชี้? int* i; หรือ int *i; หรือ int * i; หรือ int*i; กรุณาอธิบายว่าทำไม ดูเพิ่มเติมได้ที่: http://www.stroustrup.com/bs_faq2.html#whitespace

2
เหตุใด C สตริงตัวอักษรอ่านอย่างเดียว?
ข้อได้เปรียบของสตริงตัวอักษรที่อ่านได้อย่างเดียวคืออะไร (-ies / -ied): อีกวิธีในการยิงตัวเองที่เท้า char *foo = "bar"; foo[0] = 'd'; /* SEGFAULT */ ไม่สามารถเริ่มต้นอาร์เรย์ของคำอ่าน - เขียนได้อย่างหรูหราในหนึ่งบรรทัด: char *foo[] = { "bar", "baz", "running out of traditional placeholder names" }; foo[1][2] = 'n'; /* SEGFAULT */ ภาษาที่ซับซ้อนนั้นเอง char *foo = "bar"; char var[] = "baz"; some_func(foo); /* VERY DANGEROUS! …
29 c  memory  strings 

10
การใช้ตัวแปรพอยน์เตอร์เป็นค่าใช้จ่ายในหน่วยความจำใช่หรือไม่
ในภาษาอย่าง C และ C ++ ในขณะที่ใช้พอยน์เตอร์กับตัวแปรเราต้องการที่ตั้งหน่วยความจำอีกหนึ่งแห่งเพื่อเก็บที่อยู่นั้น ดังนั้นนี่ไม่ใช่ค่าใช้จ่ายหน่วยความจำ? สิ่งนี้ได้รับการชดเชยอย่างไร? พอยน์เตอร์ใช้ในเวลาที่แอปพลิเคชันหน่วยความจำเหลือน้อยหรือไม่?
29 c++  c  pointers 

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