อะไรคือวิธีที่คุณชื่นชอบในการประกาศตัวชี้?
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
ในtypedef
s และประกาศที่คล้ายกันเพื่อเสริมสร้างภาพให้เห็นว่ามันเป็นส่วนหนึ่งของประเภท ในทำนองเดียวกันกับการประกาศฟังก์ชั่นตัวชี้:(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
เพราะง่ายกว่าที่จะเห็นว่ามันเป็นตัวชี้ถึงแม้ว่าฉันไม่คิดว่ามันจะเป็นเรื่องสำคัญ