Trong hầu hết các trường hợp (ít nhất là trong C), bạn sẽ thấy rằng sizeof(*x)
thực sự không đánh giá được *x
. Các tiêu chuẩn C99 đã này nói trong 6.5.3.4 The sizeof operator
, phần /2
(bolding của tôi):
Nhà điều hành sizeof mang lại kích thước (tính theo byte) của toán hạng của nó, có thể là một biểu thức hoặc tên trong ngoặc của một loại. Kích thước được xác định từ loại của toán hạng. Kết quả là một số nguyên. Nếu loại toán hạng là một loại mảng có độ dài biến đổi, toán hạng được đánh giá; nếu không, toán hạng không được đánh giá và kết quả là hằng số nguyên.
Vì vậy, đối với tất cả các VLA không phải là không có hội nghị diễn ra. Nếu loại *x
là VLA, được coi là một giai đoạn thực thi sizeof
, một thứ cần phải được giải quyết khi mã đang chạy - tất cả những thứ khác có thể được tính toán tại thời gian biên dịch.
C++ có quy tắc hơi khác nhau, như thể hiện trong 5.3.3. Sizeof
, phần /1
:
Nhà điều hành sizeof mang lại số byte trong đại diện đối tượng của toán hạng của nó. Toán hạng là một biểu thức, là một toán hạng chưa được đánh giá (Điều 5), hoặc một kiểu id được mã hóa.
5. Expressions
định nghĩa thuật ngữ "unevaluated toán hạng" trong phần /8
:
Trong một số hoàn cảnh, toán hạng unevaluated xuất hiện. Toán hạng chưa được đánh giá không được đánh giá.
(có lẽ một trong những cụm từ dư thừa, vô ích nhất mà tôi đã đọc trong một thời gian, nhưng tôi không biết điều gì đang diễn ra trong tâm trí của người ISO khi họ viết).
Để hoàn thành, trong C++ (không có VLAs) biểu thức không bao giờ được đánh giá: C++ 11, 5.3.3 nói "Toán hạng là một biểu thức, là toán hạng chưa được đánh giá (Điều 5), hoặc một dấu ngoặc đơn loại-id. " –
Chúc mừng, @Mike, kết hợp điều đó vào câu trả lời cho sự hoàn chỉnh. – paxdiablo