อะไรคือวิธีที่คุณชื่นชอบในการประกาศตัวชี้?
int* i;
หรือ
int *i;
หรือ
int * i;
หรือ
int*i;
กรุณาอธิบายว่าทำไม
ดูเพิ่มเติมได้ที่: http://www.stroustrup.com/bs_faq2.html#whitespace
int*i;- ช่องว่างไม่เติบโตบนต้นไม้คุณรู้ไหมว่า ...
อะไรคือวิธีที่คุณชื่นชอบในการประกาศตัวชี้?
int* i;
หรือ
int *i;
หรือ
int * i;
หรือ
int*i;
กรุณาอธิบายว่าทำไม
ดูเพิ่มเติมได้ที่: http://www.stroustrup.com/bs_faq2.html#whitespace
int*i;- ช่องว่างไม่เติบโตบนต้นไม้คุณรู้ไหมว่า ...
คำตอบ:
ถ้าคุณเขียน:
int* i, j, k;
คุณทำให้เข้าใจผิดชี้ให้เห็นว่าทั้งหมดของฉัน j และ k intเป็นตัวชี้ไปยัง
ดังนั้นฉันจึงขอยืนยันว่ามันยอดเยี่ยมกว่าที่จะผนวก * กับชื่อตัวแปร
int * i;ว่าไม่ใช่นักแข่งขันเท่านั้นเพราะมันดูเหมือนการคูณอย่างรวดเร็ว
int*ถูกมองว่าเป็นประเภทและint* i, jประกาศตัวชี้สองตัว คำถามอาจถูกพิจารณาว่าไม่สมบูรณ์ - ขึ้นอยู่กับภาษาที่คุณใช้ซึ่งรูปแบบนั้นเหมาะสม ใน CI ติดตามint *xใน C # ฉันทำอย่างอื่น
ฉันชอบint* iเพราะiมีประเภท "ตัวชี้ไปยัง int" และฉันรู้สึกว่ามันทำให้มันเหมือนกันกับระบบประเภท แน่นอนว่าพฤติกรรมที่เป็นที่รู้จักนั้นเกิดขึ้นเมื่อพยายามกำหนดพอยน์เตอร์หลาย ๆ ตัวในหนึ่งบรรทัด (คือต้องใส่เครื่องหมายดอกจันก่อนชื่อตัวแปรแต่ละตัวในการประกาศพอยน์เตอร์) แต่ฉันก็ไม่ได้ประกาศพอยน์เตอร์ด้วยวิธีนี้ นอกจากนี้ฉันคิดว่ามันเป็นข้อบกพร่องที่รุนแรงในภาษา C-style
*i int
สำหรับ C ที่เราไม่ได้มุ่งเน้นที่ประเภทฉันชอบ:
int *i;
เพราะมันมีการเน้นที่intไม่ใช่ตัวชี้ คือintอะไร *iเป็น int
int i = 5ที่จะได้รับค่าของคุณใช้ชื่อi iในทำนองเดียวกันถ้าคุณมีแล้วจะได้รับค่าที่คุณใช้int *i; *i = 5 *i
ฉันชอบint* iมานานหลายปี อย่างไรก็ตามมีข้อโต้แย้งที่ดีint *iเพราะเมื่อใช้รูปแบบเดิมคุณยังต้องจำกฎการประกาศหลายกฎ:
int* a, *b; // not int* a, b;
เนื่องจากคุณต้องจำกฎนี้คุณจะไม่ได้รับความเรียบง่าย แต่ฉันจะไม่บอกว่ามันซับซ้อนกว่ากัน การหลีกเลี่ยงการประกาศหลายครั้งในหนึ่งบรรทัดเป็นอีกวิธีหนึ่งที่จะบอกว่าคุณจำกฎนี้ได้ ความแตกต่างระหว่างสองสไตล์คือ moot
แม้ว่าฉันจะใช้มัน แต่ก็รู้สึกว่าโง่เล็กน้อยที่จะแกล้งทำไวยากรณ์การประกาศ C ทำงานได้ดีกว่าที่ทำโดยวางเครื่องหมายดอกจันถัดจากประเภทแทนที่จะเป็นตัวแปรที่ถูกผูกไว้ทาง syntactically
ฉันไม่ซื้อลงไปในอันนั้นเน้นประเภทตัวชี้ (สำหรับi) ในขณะที่อีกประเภทเน้นประเภท int (สำหรับ*i) แต่นั่นอาจเป็นไปได้ว่าหลังจาก 15 ปีของการใช้ C และ C ++ มันเป็นเพียงเมื่อฉันมองที่มันโดยไม่ต้อง ต้องคิดดูสิ - บางสิ่งที่ผู้เริ่มต้นส่วนใหญ่ถามคำถามนี้ยังทำไม่ได้
ยิ่งไปกว่านั้นฉันยังไม่ชอบมันในการอ่าน / เขียนโค้ดในรูปแบบอื่น ความสอดคล้อง bla bla blah
int * iยังไม่จำเป็นต้องพูดถึง
ฉันชอบอันแรก มันเป็นเรื่องธรรมดาเนื่องจากเป็นตัวชี้เป็นส่วนหนึ่งของประเภท
เมื่อฉันใช้ C # มันจัดการประเภทในวิธีที่ง่ายกว่า C ดังนั้นจึงไม่มีปัญหาในการประกาศตัวชี้หลายตัวในคำสั่งเดียวกัน:
int* a, b, c; // three pointers
ฉันชอบint* i(C ++ - สไตล์)
ฉันหลีกเลี่ยงการประกาศตัวแปรหลายตัวในข้อความเดียวเนื่องจากความกำกวมของภาพ ( int* i, j)
ดูเพิ่มเติมที่C ++ สไตล์และเทคนิคคำถามที่พบบ่อยของ Bjarne Stroustrupสำหรับเหตุผล
หากคุณต้องการประกาศหลายตัวแปร แต่ไม่ต้องการทำเครื่องหมายดอกจันซ้ำ:
template <typename T>
struct pointer_to
{
typedef T* type;
};
pointer_to<int>::type p1, p2, p3;
(อย่างที่คุณเห็นภายในเทมเพลต struct ฉันชอบint* iสไตล์นี้)
และนี่คือคำตอบทั่วไปเพิ่มเติม:
template <typename T>
struct identity
{
typedef T type;
};
identity<int*>::type p1, p2, p3;
อันนี้ใช้งานได้กับ "ประเภทที่มีปัญหา" ตัวอย่างเช่นอาร์เรย์และการอ้างอิง:
identity<int[10]>::type a1, a2, a3;
identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
typedef int* int_ptrจะได้ทำเคล็ดลับ แน่นอนฉันต้องประกาศ typedef ใหม่สำหรับประเภทของตัวชี้ที่แตกต่างกัน แต่ในทางปฏิบัติจะมีจำนวนเท่าไร แปดอย่างมากที่สุด?
ฉันจะไปint* i;ตั้งแต่ส่วนแรกหมายถึงประเภทตัวแปร (ตัวชี้ไปที่ int) ในขณะที่ส่วนที่สองหมายถึงชื่อ ( i) มันจะไม่ทำให้ความรู้สึกกับผมว่าประเภทคือและชื่อเป็นint *iนอกจากนี้ยังint * i;มีลักษณะเหมือนการคูณให้ฉัน
ในการประกาศผมใช้คุณอ่านมันเป็นint * i;i is a pointer to an integer
ตัวชี้ก่อให้เกิดทั้งประเภทและตัวแปรดังนั้นจึงควรอยู่ตรงกลาง
เป็นเรื่องดีที่จะหลีกเลี่ยงการประกาศหลายสิ่งในบรรทัดเดียวกัน: int * i, j;
จริง ๆ แล้วฉันใช้การประชุมทั้งสามในสถานการณ์ที่เฉพาะเจาะจง เมื่อดูแวบแรกฉันดูเหมือนจะไม่ลงรอยกัน แต่ ...
int * เมื่อไม่มีการระบุเพื่อเสริมสร้างการมองเห็นว่าไม่มีชื่อint* intptrในtypedefs และประกาศที่คล้ายกันเพื่อเสริมสร้างภาพให้เห็นว่ามันเป็นส่วนหนึ่งของประเภท ในทำนองเดียวกันกับการประกาศฟังก์ชั่นตัวชี้:(int* (*foo)(int))int *identifierและclass &identifierในฟังก์ชั่นพารามิเตอร์เพื่อเสริมกำลังให้มองเห็นว่าพารามิเตอร์นั้นอาจเป็นพารามิเตอร์ที่เรียกว่า "ออก"const int * const * constเมื่อใดก็ตามที่ผมใช้พันธุ์บ่นint * foo; ในการประกาศในท้องถิ่นฉันคิดว่าฉันค่อนข้างมุ่งเน้นการมองเห็น
ไม่มีประเภทตัวชี้ใน C! ดังนั้น "int *" จึงไม่มีความหมายอะไรเลย เครื่องหมายดอกจันถูกผูกไว้กับองค์ประกอบที่ถูกต้องเสมอมันเป็นขององค์ประกอบที่ถูกต้องไป "* i" เป็น int และเนื่องจาก * i เป็น int จึงเป็นไปตามที่ i เป็นตัวชี้ไปยัง int นั่นคือเหตุผลเบื้องหลังและนั่นคือสาเหตุที่ "int * i" เป็นทางออกเดียวที่เป็นไปได้ ทุกอย่างอื่นเป็นภาพลวงตา (ซึ่งส่วนใหญ่จะได้รับการแก้ไขโดยอัตโนมัติ) ใน C ++ และ C # นั่นคือสิ่งที่แตกต่าง แต่สำหรับ C มีเพียงพระคัมภีร์เดียว: "เดนนิสเอ็มริตชี่: ภาษาการเขียนโปรแกรม C" Dennis (RIP!) เขียนว่า: "int * i" ไม่จำเป็นต้องถามคำถามนี้
int*เป็นประเภทตัวชี้
ฉันใช้int *iเพราะง่ายกว่าที่จะเห็นว่ามันเป็นตัวชี้ถึงแม้ว่าฉันไม่คิดว่ามันจะเป็นเรื่องสำคัญ