Tại sao sử dụng toán tử sizeof cho 1 con số lại không gặp lỗi?

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

https://en.cppreference.com/w/cpp/language/sizeof
Queries size of the object or type.

4 Likes

sizeof(3.4) => sizeof(double)

4 Likes

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.

3 Likes

bạn khẳng định ở đâu ra

vì nó là double.
Muốn nó là float thì phải là 3.4f

6 Likes

Vì nó là quy ước của C/C++. :slight_smile:

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. :kissing:

5 Likes

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
3 Likes

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ủa void* :V :V

  • nếu refer tới (Base& a) thì sizeof(a) nó trả về kích cỡ của Base, mặc cho a có refer tới Derived b c d nào đi nữa :V

    When 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ới Derived 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

3 Likes

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. :slight_smile:
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). :kissing:

3 Likes

image

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.

2 Likes

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. :kissing:


:tada: Chúc mọi người năm mới vui vẻ, sức khỏe tràn trề. :tada:

2 Likes

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

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?