2013-06-10 25 views
5
int c = someIntegerValue; 

// Some code... 

int i; 
for (i = 0; i < 5, i < c; i++) { 
... 
} 

Trình biên dịch của tôi cho biết error: expression has no effect, nghe có vẻ đúng. Vậy, cái nào trong 2 so sánh đó sẽ được sử dụng ở đây? Tôi đoán là i < c bị bỏ qua, nhưng tôi muốn một số xác nhận từ những người khác vì tôi không ở vị trí để chạy mã này ...Dấu phẩy này làm gì trong phần * test * của vòng lặp for?

+0

Không phải chuyên gia C, nhưng có vẻ như nó đang cố gắng làm tương đương 'i <5 && i

+0

Quyền của trình biên dịch. 'i <5' ở đây được đánh giá, nhưng giá trị bị vứt đi mà không được sử dụng, và nó không có tác dụng phụ, vì vậy lập trình viên này hiểu rõ điều gì đó. –

+0

Tại sao bỏ phiếu xuống và bỏ phiếu? Toán tử dấu phẩy không phải là điều trực quan nhất trên thế giới. Nó vấp tôi và tôi đã mã hóa C trong gần 2 thập kỷ. –

Trả lời

14

Tuyên bố

i < 5, i < c 

Sử dụng comma operator, mà đánh giá tất cả các biểu thức từ trái sang phải nhưng chỉ tạo ra giá trị của một bìa phải. Điều này có nghĩa là biểu thức i < 5 được đánh giá và loại bỏ, trong khi biểu thức i < c được đánh giá và thực sự được sử dụng bởi vòng lặp.

tôi cho rằng tác giả có nghĩa là để viết một cái gì đó như thế này:

i < 5 && i < c 

mà thực sự xem xét cả hai biểu thức.

Điều đó nói rằng, tôi không chắc chắn tại sao đây là trình biên dịch lỗi và không phải là trình biên dịch cảnh báo. Đây là mã pháp lý, mặc dù nó gần như chắc chắn là một lỗi. Có lẽ bạn đã thiết lập trình biên dịch để báo cáo lỗi trên cảnh báo?

Hy vọng điều này sẽ hữu ích!

+4

Tôi sẽ không gọi đó là một "cách tốt hơn để làm điều này". Phiên bản có '&&' khác ngữ nghĩa với phiên bản với toán tử dấu phẩy. Rất có thể phiên bản '&&' là tác giả * có ý nghĩa gì *, nhưng không thể chắc chắn được. –

+2

'i <5 && i

+0

@ KeithThompson- Đúng, bạn nói đúng. Đã sửa! – templatetypedef

3

Đó là i < 5 bị bỏ qua.

Các diễn tả trọn vẹn là:

i < 5, i < c

Đó là hai biểu thức riêng biệt sự tham gia của các comma-operator.

Toán tử dấu phẩy hoạt động bằng cách đánh giá biểu thức đầu tiên (i < 5), sau đó biểu thức thứ hai (i < c) và biểu thức đầy đủ nhận giá trị của phần thứ hai.

Phần đầu tiên của biểu thức chỉ có vấn đề nếu nó có tác dụng phụ.

Nó là phổ biến, và được sử dụng đúng theo cách này:
dụ

for(i = 0, j = 10; i < 10; ++i, --j) 
/* i goes from 0-10, while j goes from 10-0 at the same time */ 

Nhưng trong cách thể hiện trong mã của bạn, nó không có mục đích ý nghĩa, và chỉ bối rối của người khác.

1

Ở đây , toán tử dấu phẩy đóng một vai trò. Có nghĩa là, nó evaulates từ trái sang phải và trả về biểu thức cuối cùng. Vì vậy, i<5 được đánh giá, i<c được đánh giá nhưng trả lại kết quả là i<c là biểu thức cuối cùng của nó.

i < 5, i < c hoàn toàn vô nghĩa. Nó không có sự khác biệt với i < c.

Tùy thuộc vào tác giả logic là sai lầm của nó.

7

Đó là toán tử dấu phẩy. Nó đánh giá các toán hạng trái và phải của nó (luôn luôn theo thứ tự đó), và mang lại kết quả của toán hạng bên phải. Nó có ý nghĩa để sử dụng nó nếu toán hạng bên trái được đánh giá cho các tác dụng phụ của nó; kể từ i < 5 không có tác dụng phụ, trình biên dịch cảnh báo bạn về nó.

Đó là i < 5, không phải i < c bị bỏ qua. Mã này tương đương với:

for (i = 0; i < c; i++) { 
    ... 
} 

Thật khó để đoán những gì nó đã dành được. Có lẽ tác giả thực sự có nghĩa là:

for (i = 0; i < 5 && i < c; i++) { 
    ... 
} 
3

Kết quả của toán tử dấu phẩy là giá trị của toán hạng bên phải.

Đây là toán hạng bên trái (i < 5) không có tác dụng phụ nên

i < 5, i < c 

thực sự là tương đương với

i < c 
2

Đó là một kết quả của việc sử dụng các nhà điều hành dấu phẩy. Biểu thức bên trái được đánh giá, và sau đó kết quả bị loại bỏ. Sau đó, biểu thức đúng được đánh giá. Kết quả của toán tử dấu phẩy là kết quả của biểu thức đúng.

Vì biểu thức bên trái (i < 5) là không có op, bạn nhận được cảnh báo bạn đang xem. Câu hỏi bây giờ là "tác giả đã có ý định gì?" Nếu không có nhiều ngữ cảnh hơn, chúng tôi không thể nói, nhưng có thể là một trong những điều sau:

i < 5 
    i < c 
    i < 5 && i < c 
Các vấn đề liên quan