เหตุใดจึงsizeof
ถือว่าเป็นตัวดำเนินการและไม่ใช่ฟังก์ชัน
คุณสมบัติใดบ้างที่จำเป็นในการเป็นผู้ดำเนินการ
เหตุใดจึงsizeof
ถือว่าเป็นตัวดำเนินการและไม่ใช่ฟังก์ชัน
คุณสมบัติใดบ้างที่จำเป็นในการเป็นผู้ดำเนินการ
คำตอบ:
เนื่องจากมาตรฐาน C บอกอย่างนั้นและได้รับการโหวตเพียงอย่างเดียว
ผลที่ตามมา:
sizeof (int)
แทนนิพจน์อ็อบเจ็กต์int a; printf("%d\n", sizeof a);
ดี พวกเขากำลังเห็นบ่อยแรกเพราะพวกเขากำลังจำเป็นต้องเป็นส่วนหนึ่งของการแสดงออกประเภทหล่อและประการที่สองเพราะ sizeof มีลำดับความสำคัญสูงมากจึงไม่ได้เช่นเดียวกับsizeof a + b
sizeof (a+b)
แต่ไม่ได้เป็นส่วนหนึ่งของการเรียกใช้ sizeof แต่เป็นส่วนหนึ่งของตัวถูกดำเนินการsizeof a++
ไม่แก้ไข a)ฟังก์ชันจะแตกต่างกันในทุกประเด็น อาจมีความแตกต่างอื่น ๆ ระหว่างฟังก์ชันและตัวดำเนินการยูนารี แต่ฉันคิดว่านั่นเพียงพอแล้วที่จะแสดงให้เห็นว่าทำไม sizeof จึงไม่สามารถเป็นฟังก์ชันได้แม้ว่าจะมีเหตุผลที่ต้องการให้เป็น
sizeof
มีผลข้างเคียงหากมี VLA อยู่ในนิพจน์
sizeof
: sizeof unary-expression
และsizeof ( type-name )
- ดังนั้นในมาตรฐาน C11 จึงไม่ถือว่าเป็น 'cast' แต่เป็นชื่อประเภทในวงเล็บ ผลสุทธิมากเหมือนกัน (สำหรับการเปรียบเทียบการแสดงออกของนักแสดงคือ( type-name ) cast-expression
) และฉันเกลียดวิธีที่ความคิดเห็น Markdown ทำงานแตกต่างจาก Q&A Markdown!
สามารถใช้เป็นค่าคงที่เวลาคอมไพล์ซึ่งเป็นไปได้ก็ต่อเมื่อเป็นตัวดำเนินการแทนที่จะเป็นฟังก์ชัน ตัวอย่างเช่น:
union foo {
int i;
char c[sizeof(int)];
};
ในทางไวยากรณ์หากไม่ใช่ตัวดำเนินการก็จะต้องเป็นมาโครตัวประมวลผลล่วงหน้าเนื่องจากฟังก์ชันไม่สามารถใช้ประเภทเป็นอาร์กิวเมนต์ได้ นั่นจะเป็นมาโครที่ยากในการนำไปใช้เนื่องจากsizeof
สามารถใช้ทั้งชนิดและตัวแปรเป็นอาร์กิวเมนต์ได้
เนื่องจากมาตรฐาน C บอกอย่างนั้นและได้รับการโหวตเพียงอย่างเดียว
และมาตรฐานน่าจะถูกต้องเพราะsizeof
ใช้ประเภทและ
โดยทั่วไปถ้าโดเมนหรือโคโดเมน (หรือทั้งสองอย่าง) ของฟังก์ชันมีองค์ประกอบที่ซับซ้อนกว่าจำนวนจริงอย่างมีนัยสำคัญฟังก์ชันนั้นจะเรียกว่าตัวดำเนินการ ในทางกลับกันหากทั้งโดเมนหรือโคโดเมนของฟังก์ชันไม่มีองค์ประกอบที่ซับซ้อนกว่าจำนวนจริงฟังก์ชันนั้นน่าจะเรียกง่ายๆว่าฟังก์ชัน ฟังก์ชันตรีโกณมิติเช่นโคไซน์เป็นตัวอย่างของกรณีหลัง
นอกจากนี้เมื่อมีการใช้ฟังก์ชันบ่อยจนมีการพัฒนาสัญกรณ์ได้เร็วขึ้นหรือง่ายกว่ารูปแบบ F (x, y, z, ... ) ทั่วไปรูปแบบพิเศษที่ได้จะเรียกอีกอย่างว่าตัวดำเนิน ตัวอย่าง ได้แก่ ตัวดำเนินการ infix เช่นการบวก "+" และการหาร "/" และตัวดำเนินการ postfix เช่นแฟกทอเรียล "!" การใช้งานนี้ไม่เกี่ยวข้องกับความซับซ้อนของเอนทิตีที่เกี่ยวข้อง
เพราะไม่ใช่หน้าที่. คุณสามารถใช้มันได้ดังนี้:
int a;
printf("%d\n", sizeof a);
ฟังก์ชันมีจุดเข้าใช้งานรหัส ฯลฯ ฟังก์ชันจะถูกเรียกใช้ที่รันไทม์ (หรืออินไลน์) ต้องกำหนดขนาดของเวลาในการคอมไพล์
ตัวดำเนินการ sizeof คือเอนทิตีเวลาคอมไพล์ไม่ใช่รันไทม์และไม่จำเป็นต้องมีวงเล็บเหมือนฟังก์ชัน เมื่อคอมไพล์โค้ดแล้วจะแทนที่ค่าด้วยขนาดของตัวแปรนั้นในเวลาคอมไพล์ แต่ในฟังก์ชันหลังจากที่ฟังก์ชันได้รับการดำเนินการแล้วเราจะทราบค่าที่ส่งคืน
เพราะ:
sizeof
"ฟังก์ชัน" จะไม่มีทางกำหนดขนาดได้มีความแตกต่างเล็กน้อยจากฟังก์ชัน - ค่าของ sizeof ได้รับการแก้ไขในเวลาคอมไพล์ แต่ไม่ใช่ที่รันไทม์!
เนื่องจากเป็นตัวดำเนินการเวลาคอมไพล์ที่ในการคำนวณขนาดของออบเจ็กต์จำเป็นต้องใช้ข้อมูลประเภทที่พร้อมใช้งานในเวลาคอมไพล์เท่านั้น สิ่งนี้ไม่ถือสำหรับ C ++
sizeof()
ตัวดำเนินการคือเวลาคอมไพล์จะเกิดขึ้น สามารถใช้เพื่อกำหนดพารามิเตอร์หรืออาร์กิวเมนต์
Sizeof () ฉันคิดว่ามันเป็นทั้งฟังก์ชันและตัวดำเนินการ ทำไม? เนื่องจากฟังก์ชันมีวงเล็บสำหรับรายการที่ขั้นตอนการป้อนข้อมูล แต่ส่วนใหญ่แล้วตัวดำเนินการทำให้ตัวดำเนินการเป็นตัวดำเนินการดังนั้น sizeof จึงเป็นคำสั่งการดำเนินการที่ดำเนินการกับตัวถูกดำเนินการในวงเล็บ