2011-12-15 19 views
5

Tôi có ba đoạn mã. Điều này:Tại sao khởi tạo kép này bằng dấu phẩy bất hợp pháp?

1,7; //yes, that's all the code 

biên dịch được. Điều này:

double d = (1, 7); 

cũng biên dịch được. Tuy nhiên, điều này:

double d = 1, 7; 

không biên dịch được. gcc-4.3.4 nói

error: expected unqualified-id before numeric constant

và Visual C++ 10 nói

error C2059: syntax error : 'constant'

chênh lệch Tại sao như vậy? Tại sao không phải tất cả ba biên dịch với , có cùng tác dụng trong cả ba?

+3

Tôi nghĩ rằng ngữ pháp sẽ thực sự khá phức tạp khi xử lý 'double d = 1, 7; 'như một khai báo đơn, với' 1, 7' làm biểu thức khởi tạo, trong khi xử lý 'double d = 1, e = 7; 'là hai người khai báo. Hoặc bạn sẽ đi xa hơn nữa, và nói rằng nếu đã có một 'e' trong phạm vi thì' double d = 1, e = 7; 'cũng * cũng * được coi là một khai báo đơn, với biểu thức khởi tạo' 1, e = 7'? Tôi thấy rất nhiều tiềm năng cho sự nhầm lẫn, chỉ để tiết kiệm gõ một vài parens trong trường hợp 'double d = (1, 7);' đó là vô nghĩa anyway. –

Trả lời

13

Trong hai trường hợp đầu tiên, những điều khoản đang sử dụng C++ 's comma operator

Trong trường hợp sau, dấu phẩy được sử dụng như là biến riêng và trình biên dịch được mong đợi bạn khai báo nhiều định danh; dấu phẩy không được sử dụng làm toán tử ở đây.

Trường hợp cuối cùng cũng tương tự như một cái gì đó như:

float x,y; 
float a = 10, b = 20; 

Khi bạn làm điều này:

double d = 1, 7; 

Trình biên dịch hy vọng một tên biến và không phải là một hằng số. Do đó 7 là bất hợp pháp ở đây.

Tuy nhiên khi bạn làm điều này:

double d = (1,7); 

toán tử phẩy bình thường đang được sử dụng: 1 được đánh giá và loại bỏ trong khi 7 được lưu trữ trong d.

+0

+1: Có, câu trả lời chủ yếu là "vì ngữ pháp nói như vậy". –

+5

"toán tử dấu phẩy không được sử dụng theo cách thông thường" - chính xác, dấu phẩy đó không phải là toán tử dấu phẩy. Đó là dấu phân cách giữa hai người khai báo và '7' không phải là người khai báo hợp lệ. –

+0

Cảm ơn Steve. Cập nhật câu trả lời của tôi :-) – sharjeel

0

Tôi tin rằng đó là vì người cuối cùng được coi là dòng (không chính xác) tuyên bố: (double d = 1), (7)

+0

Nếu đúng như vậy, nó sẽ biên dịch, cũng giống như 1,7; làm. – Nikodemus

+0

1,7; về cơ bản là một câu lệnh rất đơn giản, vì vậy nó được phép bởi trình biên dịch ... Dòng cuối cùng của bạn là khai báo sai. – DejanLekic

+0

Dòng đang được coi là 'double (d = 1), (7);' và dưới dạng biến không thể bắt đầu bằng số 'double 7' là lỗi cú pháp –

5

Sự khác biệt là ở 1, 7;(1, 7) bạn có biểu hiện nơi một nhà điều hành dấu phẩy được cho phép.

ví dụ cuối cùng của bạn

double d = 1, 7; 

là một tuyên bố, nơi dấu phẩy không phải là một nhà điều hành nhưng một tách. Trình biên dịch exepcts một cái gì đó như

double d = 1, e = 7; 

đó sẽ là một tuyên bố biến đúng.

Lưu ý rằng dấu phẩy đôi khi là toán tử (trong biểu thức), nhưng cũng được sử dụng làm dấu tách ở các vị trí khác như danh sách tham số trong khai báo hàm.

3
  1. double d = (1, 7); Ở đây (1, 7) sẽ được đánh giá đầu tiên; dấu phẩy hoạt động như toán tử đánh giá tuần tự7 sẽ được gán cho d.

  2. double d = 1, 7; Trong trường hợp này có một vấn đề: phần trước dấu phẩy có nghĩa là bạn khai báo một đôi và thiết lập giá trị của nó, nhưng phần sau dấu phẩy là vô nghĩa, bởi vì nó chỉ là một đơn hằng số nguyên .

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