2011-09-05 43 views
9

Tôi đã thấy rằng trong một số vòng lặp và gia số. Thay vì làm i + + họ làm i + = 1. Tại sao điều này?Tại sao mọi người sử dụng i = i + 1 thay vì i + +?

+0

Tại sao là câu hỏi của bạn trong tiêu đề khác nhau từ câu hỏi trong cơ thể? Bạn muốn hỏi cái nào? –

+0

Tôi sử dụng 'i + = 1', ngoại trừ ở vị trí thứ 3 của một vòng lặp for trong trường hợp này tôi sử dụng' i ++ '. –

Trả lời

9

Không phải tất cả ngôn ngữ đều có nhà điều hành ++ (python, cho một) ... Có lẽ những người này đến từ một nền tảng trong một trong những ngôn ngữ đó. Ngoài ra một số người cảm thấy rằng i++ không phải là rất rõ ràng, đặc biệt là kể từ khi một số ngôn ngữ điều trị i++++i khác nhau.

+7

Mọi ngôn ngữ mà tôi biết về các xử lý 'i ++' và '++ i' khác nhau theo một cách chính xác: giá trị của biểu thức.Nói cách khác, 'x = i ++;' gán giá trị nhỏ hơn một cho 'x' hơn là' x = ++ i'. Đó là những gì bạn có trong tâm trí? Tôi tò mò về việc bạn sử dụng từ "một số"; Bạn có biết các ngôn ngữ có cả tiền tố và các toán tử gia tăng postfix và không làm cho sự khác biệt này? –

+1

@Ted Hopp Perl sẽ trả về giá trị * * hoặc * * tùy thuộc vào mức tăng trước hoặc sau. Điều này có thể dẫn đến hành vi khó hiểu. Ở dạng cơ bản, đây không phải là vấn đề. Điều này rất khó hiểu trong các trường hợp 'foo ($ x, ++ $ x)', tuy nhiên (đánh giá vẫn xảy ra từ trái qua phải). Ngoài ra, C/C++ có rất nhiều UB với các sửa đổi khác nhau (++/-) và truy cập giữa hai điểm chuỗi. –

+1

Trong javascript cho trình duyệt IE10 (và có lẽ <10 là tốt) i + + là 15% * chậm hơn * so với i + = 1. Vì vậy, tôi luôn luôn thích sử dụng i + = 1, chỉ vì nó nhanh hơn và ngữ nghĩa nó thực tế là cùng một quyền. – Yeti

14

Tùy chọn và kiểu dáng cá nhân.

3

Ngăn chặn sự khéo léo dư thừa. Ít nhất đó là những gì Crockford nói.

+2

Tuy nhiên, mã xảo quyệt sẽ xảo quyệt mà không có "++" và mã sạch sẽ là mã sạch với "++". –

2

i = i + 1 dễ giải mã bằng tiếng Anh hơn. i++ mặc dù hoàn toàn chính xác không dịch tốt khi người mới bắt đầu đọc mã. Các lập trình viên đã có thể cố gắng để làm cho mã của họ dễ đọc hơn bởi người mới bắt đầu, hoặc có lẽ chỉ không cố gắng để được quá quan tâm về cú pháp. Không có lý do nào là số tốt để sử dụng cái kia.

0

Một số người tìm thấy i = i + 1 hoặc i += 1 mô tả chi tiết hơn i++. Nó chỉ là vấn đề về phong cách mã hóa và khả năng đọc. Trong hầu hết các ngôn ngữ hiện tại, không có sự khác biệt về hiệu suất ở tất cả các cách khác nhau.

Có một số vấn đề về khả năng đọc với các toán tử ++--, nhưng chủ yếu khi chúng được sử dụng cùng với các toán tử khác, nó không thực sự là vấn đề khi chúng được sử dụng. Ví dụ: một biểu thức như ++x+-++y+-z++ hoàn toàn hợp lệ, nhưng thật khó để xem nó thực sự làm gì. Vì các nhà khai thác gây ra các vấn đề về khả năng đọc trong một số trường hợp, một số người cảm thấy rằng họ luôn luôn nên tránh.

+0

Tuy nhiên, đây là một cực đoan. Trong khi tôi thích '+ =' đến '++', mã tốt là mã tốt và mã xấu là mã xấu: '++ x + - ++ y + -z ++' không phải là mã tốt, '++' sang một bên. Ví dụ, hãy tưởng tượng nếu "quy tắc" để sử dụng 'i ++' (hoặc thậm chí '+ + i') là" chỉ trong ngữ cảnh câu lệnh ". Điều này không khác với "quy tắc" hạn chế việc sử dụng 'x = i = i + 1' hoặc các dị hình khác như vậy. –

+0

@pst: Tất nhiên đó là mã xấu, điểm có ví dụ là chứng minh rằng các toán tử có thể được sử dụng để viết mã không đọc được. – Guffa

3

Lý do chung là có hai phiên bản khác nhau của increment rằng hành xử khác nhau

var i = 0; 
1 == ++i // true 

var i = 0; 
1 == i++; // false 

++i dịch để "increment i, sau đó đánh giá" trong khi i++ dịch để "đánh giá i, sau đó tăng"

Khi bạn viết những biểu thức này là i = i + 1; thì rõ ràng ý định của lập trình viên là gì và dễ dàng tìm lỗi trong mã. Đó là lý do mọi người cùng viết "khoản Yoda" như

if(6 == x){ 
    //. . . 
} 

bởi vì nếu bạn vô tình làm

if(6 = x){ 
    //. . . 
} 

nó dễ dàng hơn để bắt sai lầm

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