sách gpt4 ai đã đi

Sự khác biệt giữa &C::c và &(C::c) là gì?

In lại Tác giả: IT Lao Gao Thời gian cập nhật: 2023-10-28 13:57:38 30 4
mua khóa gpt4 Nike

Mã kiểm tra bên dưới, tôi đưa thông tin đầu ra vào phần bình luận. Tôi đang sử dụng gcc 4.8.5 và Centos 7.2.

#include 
#include

lớp C
{
công cộng:
hàm foo() {
printf("%p, %p\n", &C::c, &(C::c)); // giá trị đầu ra là 0x4, 0x7ffc2e7f52e8
std::cout << &C::c << std::endl; // giá trị đầu ra là 1
}
số nguyên a;
số nguyên c;
};

int main(void)
{
C-c;

printf("%p\n", &C::c); // giá trị đầu ra là 0x4
std::cout << &C::c << std::endl; // giá trị đầu ra là 1

// printf("%p\n", &(C::c)); // lỗi biên dịch, sử dụng không hợp lệ thành viên dữ liệu không tĩnh 'C::c'

co.foo();

trả về 0;
}
  1. theoThứ tự ưu tiên của toán tử C++ ,:: Độ ưu tiên của toán tử cao hơn & người điều hành. Tôi nghĩ &C::c bình đẳng &(C::c)nhưng kết quả thì ngược lại. Tại sao chúng lại khác nhau?
  2. &(C::c) Điều này khiến main biên dịch không chính xác và đồ ăn Không có chức năng nào cả, tại sao?
  3. infstd::coutở giữa&C::cCác giá trị khác nhau, tại sao vậy?

1 Câu trả lời

C++ kết hợp hai dạng toán hạng với & Phân biệt chúng. toán tử, giá trị lvalue nói chung và định danh (có đủ điều kiện) nói riêng. hiện hữu &C::c & Toán hạng của là một định danh đủ điều kiện (tức là chỉ là một tên) và &(C::c)Toán hạng là một biểu thức chung (bởi vì ( không thể là một phần của tên).

Biểu mẫu định danh đủ điều kiện có một trường hợp đặc biệt: nếu nó tham chiếu đến một thành viên không tĩnh của một lớp (chẳng hạn như lớp của bạn) C::c ),&Trả về một giá trị đặc biệt gọi là "con trỏ tới thành viên của C". Nhìn thấy ở đây để biết thêm thông tin về các con trỏ thành viên .

hiện hữu &(C::c)Không có trường hợp đặc biệt nào. C::cPhân tích cú pháp thông thường không thành công vì không thể lấy được đối tượngcthành viên. Ít nhất chủ yếu Đây chính là trường hợp đó. ;hiện hữu C phương pháp (giống như của bạn đồ ăn ) có một hàm ý cái nàyđối tượng, vì vậy C::cNó thực sự có nghĩa là này->cỞ đó.

Còn tại sao inf Đầu ra khác với cout : Khi bạn cố gắng sử dụng << Khi in một con trỏ thành viên, nó được chuyển đổi ngầm định thành bool , sản xuất SAINếu nó là một con trỏ null và ĐÚNG VẬYnếu không thì. SAIIn dưới dạng 0 ; ĐÚNG VẬYIn dưới dạng 1 .Con trỏ thành viên của bạn không phải là null, vì vậy bạn nhận được 1 Điều này khác với các con trỏ thông thường, được chuyển đổi ngầm định thành trống rỗng *và in ra dưới dạng địa chỉ, nhưng con trỏ thành viên không thể được chuyển đổi thành trống rỗng *Vì vậy, quá tải duy nhất có thể áp dụng làtoán tử<<Đúng bool Nhìn thấy https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt#Notes .

Xin lưu ý rằng về mặt kỹ thuật của bạn infCuộc gọi có hành vi không xác định. %Pnhu cầu trống rỗng *Và bạn đang truyền cho nó các con trỏ có kiểu khác nhau. Trong các lệnh gọi hàm bình thường, nó được tự động chuyển đổi thành T *ĐẾNtrống rỗng *Tôi có thể đá, nhưnginflà một hàm đối số biến, không cung cấp ngữ cảnh kiểu cho danh sách đối số của nó, do đó bạn cần phải chuyển đổi nó theo cách thủ công:

printf("%p\n", static_cast(&(C::c)));

Phần có liên quan của tiêu chuẩn là[expr.unary.op],giải thích:

Kết quả của đơn vị & toán tử là một con trỏ đến toán hạng của nó. Toán hạng sẽ là một giá trị lvalue hoặc một id đủ điều kiện. Nếu toán hạng là một id đủ điều kiện đặt tên cho thành viên không tĩnh hoặc thành viên biến thể tôi của một số lớp C với loại T, kết quả có kiểu “con trỏ tới thành viên của lớp C của loại T” và là một giá trị prvalue chỉ định C::m. Nếu không, nếu kiểu của biểu thức là T, kết quả có kiểu “con trỏ tới T[...]

Sự khác biệt giữa &C::c và &(C::c) là gì? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/52940237/

30 4 0
CNTT Lao Gao
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com