các anh chị ơi em thắc mắc là toán tử sizeof dùng để xem dung lượng của biến vậy mà ở đây em sử dụng toán tử sizeof cho 1 con số mà compliler không báo lỗi
Tại sao sử dụng toán tử sizeof cho 1 con số lại không gặp lỗi?
sizeof(3.4) => sizeof(double)
sizeof thì nó phụ thuộc vào biến bạn khái báo là thuộc kiểu dữ liệu là gì chứ.
bạn truyền vào 3.4 thì làm sao nó hiểu là float hay double.
3.4 để như vậy là double.
bạn khẳng định ở đâu ra
vì nó là double.
Muốn nó là float thì phải là 3.4f
Vì nó là quy ước của C/C++.
0 // int
0u // unsigned int
0l // long int
0.0 // double
0.0f // float
0.0l // long double
Edit
Thêm long double
+ đổi chỗ cho ẹp.
https://en.cppreference.com/w/cpp/language/floating_literal
nguồn đây nha :V
suffix, if present, is one of f, F, l, or L. The suffix determines the type of the floating-point literal:
- (no suffix) defines double
- f F defines float
- l L defines long double
Hmm, theo mình, đã từng học và làm việc với nhiều ngôn ngữ lập trình, và nhận thấy “có vẻ” là KHÔNG CÓ NGÔN NGỮ NÀO HOẠT ĐỘNG NHƯ THẾ CẢ.
Ngôn ngữ hoạt động, thao tác, xử lý với DỮ LIỆU chứ không phải với BIẾN.
Ví dụ trong Java, kiểu dữ liệu cha là X
có phương thức a()
, kiểu dữ liệu con là Y
, được override phương thức a()
thì khi khai báo X x = new Y(); y.a();
, JVM sẽ xác định được x
là “đối tượng kiểu Y
nằm ở ô nhớ 0x123afcb3” gì gì đó và gọi phương thức a()
được override trong Y
, mặc dù biến x
có kiểu dữ liệu là X
.
nguyên văn có ghi thêm chữ sizeof
mà :V
sizeof phụ thuộc vào kiểu của biến là đúng rồi :V
https://en.cppreference.com/w/cpp/language/sizeof
When applied to an expression,
sizeof
does not evaluate the expression, and even if the expression designates a polymorphic object, the result is the size of the static type of the expression.
có đa hình hay ko cũng vậy, nó cũng chỉ tính size của kiểu của biến hiện tại chứ ko phải kiểu của biến trỏ tới/refer tới :V
-
nếu trỏ tới (
Base* a
) thì sizeof(a) nó trả về kích cỡ của con trỏ tức là kích cỡ củavoid*
:V :V -
nếu refer tới (
Base& a
) thì sizeof(a) nó trả về kích cỡ củaBase
, mặc cho a có refer tớiDerived b c d
nào đi nữa :VWhen applied to a reference type, the result is the size of the referenced type.
-
nếu là
Base a
thì a nó là biến kiểu Base, ko trỏ/refer tớiDerived
nào được, ko giống như Java nó “ẩn” con trỏ trong kiểu đi :V
C++ nhiều cái có mang Java vào được đâu :V
Base* a
có nghĩa là a có kiểu dữ liệu Base*
=> sizeof(a)
tương đương với sizeof(Base*)
tương đương với sizeof(void*)
Base &a = b
có nghĩa là a là b
=> a có kiểu dữ liệu Base
=> sizeof(a)
tương đương với sizeof(Base)
Túm váy lại, sizeof
vẫn phụ thuộc vào giá trị.
E không nghĩ vậy.
Chi ít thì đối với C++ thì nó vẫn là phụ thuộc vào kiểu dữ liệu.
Ví dụ như cái tham chiếu này nè. Bản chất của reference trong C++ nó chính là pointer, nhưng đã được màu mè hóa theo đúng cái tên của nó (C cộng cộng).
Nên đúng ra sizeof(a)
nó phải trả về sizeof(Base*)
nhưng đã chót làm màu thì phải làm tới bến, vậy là nó cho thành sizeof(Base)
.
Bản chất của ref là pointer, nhưng về mặt hình thức, nếu xét theo quy cách chung thì cách khai báo Base& a = b;
cho thấy a có kiểu dữ liệu là Base&
. Tất nhiên làm gì có Base&
, không thể nói a
là con trỏ. Nó là 1 cú pháp riêng, không phải là cách khai báo thông thường, vì vậy, nó là một quy ước a is Base
.
Chơi cast có được không.
#include <iostream>
#include <string>
int main() {
std::cout << sizeof("Sherly1001") << "\n";
std::cout << sizeof((std::string)"Sherly1001") << "\n";
std::cout << sizeof(0) << "\n";
std::cout << sizeof((char)0) << "\n";
std::cout << sizeof((double)0) << "\n";
return 0;
}
11
32
4
1
8
sizeof
is not a real operator in C++. It is merely special syntax which inserts a constant equal to the size of the argument.sizeof
doesn’t need or have any runtime support.
Cái sizeof
này chạy lúc compile chứ không phải runtime.
Nếu đối số của nó là một giá trị thì nó sẽ căn cứ theo cái quy ước ở trên mà lần.
Còn nếu là một biến được khai báo nào đó, thì nó sẽ đi ngược từ tên biến về nơi khai báo để lấy kiểu của biến đó. Rồi lại tiếp tục làm cái trò tra bảng như trên. :v :v :v
Hình như bàn hơi xa vấn đề chính rồi. Thớt đã có câu trả lời rồi thì nên để topic này đi vào năm tháng thôi.
Mai là được nhận tiền lỳ xỳ roài (đen cho ai lớn rồi mà phải đi lỳ xỳ nha), chơi thôi, học hành gì tầm này nữa.
Chúc mọi người năm mới vui vẻ, sức khỏe tràn trề.
giá trị nghĩa là sao :V :V
#include <iostream>
struct A { char adata[11]; };
struct B : A { char bdata[12]; };
int main()
{
B b;
A& a = b;
std::cout << sizeof(a) << " " << sizeof(b) << "\n";
}
a ref tới b, a và b là một nhưng sizeof(a) cho ra 11, sizeof(b) cho ra 23 :V sizeof nó có biết gì về đa hình đâu :V Nó chỉ biết kiểu của a là A&, mà sizeof(ref) là sizeof kiểu mà nó ref tới, ở đây là A. Dù a có ref tới b nó vẫn trả về sizeof(A), tức là đâu có phụ thuộc giá trị của a mà phụ thuộc kiểu của a :V
sizeof trong C vẫn có thể đánh giá ở runtime, vì VLA :V :V Còn C++ là compile time only (trừ mấy compiler rác rưởi cho phép VLA trong C++) :V