2011-12-23 50 views
9
int a = 1; 
int b = (1,2,3); 
cout << a+b << endl; // this prints 4 
  1. (1,2,3) một số loại cấu trúc trong C++ (một số loại nguyên thủy của danh sách, có lẽ?)
  2. Tại sao b gán giá trị 3? Trình biên dịch có lấy giá trị cuối cùng từ danh sách không?
+1

Không có logic nào đằng sau mã đó. Đó là điều mà giáo viên sẽ làm để kiểm tra sự hiểu biết của bạn về toán tử dấu phẩy. Sử dụng [bài tập về nhà] khi thích hợp. –

+0

hoặc là lỗi đánh máy. Tức là (1,2,3) không phải là tác giả của mã dự định. – ddyer

+0

có thể trùng lặp của [Toán tử dấu phẩy \ ', \' làm gì trong C?] (Http: // stackoverflow.com/questions/52550/what-does-the-comma-operator-do-in-c) –

Trả lời

8

Vâng, chính xác là: trình biên dịch lấy giá trị cuối cùng. Đó là toán tử dấu phẩy và nó đánh giá toán hạng của nó từ trái qua phải và trả về giá trị tận cùng bên phải. Nó cũng giải quyết từ trái qua phải. Tại sao mọi người sẽ viết mã như vậy, tôi không có ý tưởng :)

Vì vậy int b = (1, 2, 3) tương đương với int b = 3. Nó không phải là một danh sách nguyên thủy của bất kỳ loại nào, và toán tử dấu phẩy , chủ yếu được sử dụng để đánh giá nhiều lệnh trong ngữ cảnh của một biểu thức, chẳng hạn như a += 5, b += 4, c += 3, d += 2, e += 1, f chẳng hạn.

+4

Cách sử dụng tốt nhất (loại) nằm bên trong (;; ++ x, ++ y) –

+0

@LokiAstari: Yup. (Tôi vừa mới nhận ra - bởi "Tại sao mọi người sẽ viết mã như thế, tôi không biết" Tôi đang nói đến '(1, 2, 3)' là vô ích. Toán tử dấu phẩy được chấp nhận trong các trường hợp khác ':)') – Ryan

+0

Lý do duy nhất có thể (không nhất thiết phải là tốt) mà tôi có thể nghĩ đến sẽ là xâu chuỗi các hoạt động với nhau, nơi bạn không quan tâm đến kết quả của từng hoạt động. [ví dụ] (http://ideone.com/MuwxQ). * chỉnh sửa: * và Loki sẽ là người khác. – FakeRainBrigand

6

(1,2,3) là một biểu thức sử dụng hai phiên bản của toán tử dấu phẩy. Toán tử dấu phẩy đánh giá toán hạng trái của nó, sau đó có một điểm chuỗi và sau đó nó đánh giá toán hạng bên phải của nó. Giá trị của toán tử dấu phẩy là kết quả của việc đánh giá toán hạng tay phải, kết quả của việc đánh giá toán hạng bên trái bị loại bỏ.

int b = (1,2,3); 

là, do đó, tương đương với:

int b = 3; 

Hầu hết các trình biên dịch sẽ cảnh báo về việc sử dụng như vậy của các toán hạng dấu phẩy như chỉ có bao giờ một điểm để sử dụng một nhà điều hành dấu phẩy nếu các biểu hiện tay trái có một số tác dụng phụ.

1

Đây là toán tử dấu phẩy có dạng expr, expr. Biểu thức đầu tiên được đánh giá và kết quả bị loại bỏ, biểu thức thứ hai được đánh giá và kết quả của nó được trả về.

Trong trường hợp của bạn dòng đó được đánh giá là:

((1, 2), 3) => 
(2, 3) => 
3 
4

Dòng thứ hai là sử dụng toán tử dấu phẩy. Một biểu thức như

a, b 

đánh giá cả ab và trả b.

Trong trường hợp này, dòng thứ hai được phân tách như:

int b = ((1, 2), 3); 

nên (1, 2) được đánh giá (để 2) sau đó vứt bỏ, và kết quả cuối cùng chỉ đơn giản là 3.

-3

nó có thể sử dụng để là b = foo (1,2,3) nhưng foo bị xóa vô tình. C không phàn nàn về loại crap này "đó là một tính năng".

+0

Tôi nghĩ rằng những người trong số các bạn đang giải thích câu trả lời này đang thiếu một điểm quan trọng. Không ai viết mã này. Nếu người hỏi đang cố hiểu mã này, anh ta phải hiểu rằng đó không phải là điều mà tác giả thực sự muốn. – ddyer

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