2011-12-30 47 views
11

Mã này:Có sự khác biệt giữa int & a và int & a không?

int a = 5; 
int& b = a; 
b = 7; 
cout << a; 

in ra 7, và thay thế int& b với int &b cũng in ra 7.

Trong thực tế cũng vậy int&bint & b.

Tôi đã thử nghiệm loại hành vi này với một lớp đơn giản. Nói chung, nó có bao giờ quan trọng cho dù dấu và được đặt tương đối so với loại và định danh? Cảm ơn.

+1

không có sự khác biệt nào. – Nerdtron

Trả lời

15

Không, hoàn toàn không có sự khác biệt ngoại trừ kiểu mã hóa. Tôi nghĩ rằng lý luận chính về mã hóa phong cách là những lời tuyên bố này:

int& a, b; 

tuyên bố a như một int&b như một int.

+0

Cảm ơn, sẽ xem ra cho điều đó. – newprogrammer

+0

@Ryan Tôi đoán int & a, b; sẽ cung cấp lỗi biên dịch khi tham chiếu a được khai báo nhưng không được khởi tạo. – Shailesh

+0

@Shailesh: Phải, nó sẽ là 'int & a = foo, b = bar'. – Ryan

1

Nó không tạo sự khác biệt cho trình biên dịch theo cách được viết. Đó là chính xác là một vấn đề của phong cách mã.

9

Trong ngôn ngữ giống như C, khoảng trắng hầu như không quan trọng.

Tất cả các phiên bản bạn liệt kê phân tích cú pháp như cùng ba thẻ:

  • int
  • &
  • b

vì vậy họ có ý nghĩa như vậy để trình biên dịch.

Thời gian duy nhất các vấn đề khoảng trống là khi nó tách hai mã thông báo chữ và số, và thậm chí sau đó số lượng và loại khoảng trắng không quan trọng, miễn là có một số. Nhưng bất kỳ loại dấu câu nào luôn luôn trở thành một mã thông báo riêng biệt từ chữ và số, không cần khoảng trắng.

Vì vậy, mã của bạn có thể trở nên càng ngắn càng:

using namespace std;int a=5;int&b=a;b=7;cout<<a; 

Các khoảng trắng còn lại là cần thiết.

+0

Cảm ơn bạn đã làm rõ khi cần khoảng trắng. – newprogrammer

+1

Một lần khác nó quan trọng là định nghĩa macro. Nếu không có dấu cách giữa tên hàm và dấu ngoặc đơn mở sau, thì macro sẽ giống như hàm. Nếu có, thì dấu ngoặc đơn là một phần của danh sách thay thế. –

4

Nói chung, liệu dấu và ký tự có được đặt tương đối so với loại và số nhận dạng không?

Ví dụ đăng nó không quan trọng, nhưng có những trường hợp nó:

int & a, b; // b is not a ref 
int const * a; // pointer to const int 
int * const a; // const pointer to int 

Như mọi khi, khoảng trắng không quan trọng.

1

Nó không tạo ra bất kỳ sự khác biệt nào vì c/C++/java các ngôn ngữ này không nhạy cảm với không gian.

1

Đây là hai tờ khai chức năng tương đương:

int& a; // & associated with type 
int &a; // & associated with variable 

Liên kết các & hoặc * với tên loại phản ánh mong muốn của các lập trình viên có một loại con trỏ riêng biệt. Tuy nhiên, khó khăn khi liên kết & hoặc * với tên loại chứ không phải biến là, theo cú pháp chính thức C++, không phải & cũng không phải là * được phân phối trên danh sách các biến. Do đó, dễ dàng tạo ra các khai báo gây hiểu nhầm. Ví dụ, khai báo sau tạo ra một, không phải là hai tham chiếu số nguyên.

int& a, b; 

Ở đây, b được khai báo là một số nguyên (không phải là một tài liệu tham khảo số nguyên) bởi vì, khi được sử dụng trong một tuyên bố, các & (hoặc *) được liên kết với các cá nhân biến rằng nó đi trước, không để các loại nó theo sau. Vấn đề với tuyên bố này là, trực quan cả a và b dường như là kiểu tham chiếu, mặc dù chỉ a là một tham chiếu, do đó, sự nhầm lẫn thị giác không chỉ gây hiểu lầm cho những người lập trình mới, mà đôi khi cũng là lập trình viên giàu kinh nghiệm.

Việc bạn viết int &a hoặc int& a cho trình biên dịch C++ không quan trọng. Tuy nhiên, để tránh nhầm lẫn, &* phải được liên kết với biến thay vì loại.

Các vấn đề liên quan