2011-10-19 10 views
6

Hầu hết (nhưng tôi thực sự chỉ biết một số nhỏ để không được cầu kỳ vào thời điểm đó) ngôn ngữ cấp cao hỗ trợ nhiều toán tử gán khác nhau.Hỗ trợ ngôn ngữ hiện đại + = nhưng không && =

a += 5; // increment a and assign result beack to a. 

Nhưng không ai (mà tôi đã xem xét (một lần nữa một số ít)) dường như để hỗ trợ các & & = toán tử.
Lý do tôi hỏi tôi thời gian gần đây thấy điều này:

// simplified. 
bool x = false; 


x = x && testA(); // perform test A/B/C/D stop on first failure. 
x = x && testB(); 
x = x && testC(); 
x = x && testD(); 

Và tôi đã tự hỏi tại sao chúng ta không thể sử dụng:

x &&= testA(); // perform test A/B/C/D stop on first failure. 
x &&= testB(); 
x &&= testC(); 
x &&= testD(); 

Lý do được rằng & & = không được hỗ trợ trong C/C++ mà khiến chúng tôi nghĩ tại sao.

Có (không ý định chơi chữ) lý do hợp lý tại sao ngôn ngữ hỗ trợ tất cả các nhà khai thác lớn khác với một hình thức phân công nhưng không phải là & & = hoặc || =

Tôi có một hồi ức mơ hồ cho một cuộc tranh cãi chống lại những điều này, nhưng tìm kiếm google và SO rất khó khi cụm từ tìm kiếm của bạn là '& & =' và kết quả là tôi không tìm thấy gì.

+1

Tôi đã có suy nghĩ _exactly_ hôm nay, bởi vì trong lua, '&&' là từ 'và', nên tôi tự hỏi họ đã làm thế nào' && = ', và nhận ra rằng không có' && = ', trong lua hoặc in hầu hết các ngôn ngữ. –

Trả lời

1

&&|| đặc biệt theo nghĩa là hầu hết các ngôn ngữ là công trình duy nhất cung cấp đánh giá ngắn mạch để chúng được xử lý khác với các nhà khai thác thông thường, không đoản mạch khi nói đến các dạng viết tắt. Cách dễ nhất để tránh sự nhầm lẫn của &&= ngắn mạch hay không là không bao gồm nó ở nơi đầu tiên.

-1

Khi nào bạn thực sự cần điều này? Nói chung, khi bạn thực hiện các phép toán boolean, bạn không cập nhật các giá trị, mà đúng hơn là tính toán một cái gì đó cho một hoạt động một lần. Ví dụ của bạn không thực tế lắm; không có nhiều trường hợp bạn thực sự làm.

Ngoài ra, trong tất cả các ngôn ngữ mà tôi có thể nghĩ rằng bài tập tăng cường chỉ tồn tại cho các thao tác bitwise và số học, không bao giờ hoạt động boolean.

+2

Rất tiện dụng khi phía bên tay trái không phải là boolean, nhưng có * độ trung thực *. –

2

Perl hỗ trợ điều này. Rất thuận tiện để có thể viết:

$x ||= $defaultX; 
+1

Tôi nghĩ Perl hỗ trợ mọi sự kết hợp có thể có của mọi nhà điều hành và mọi thứ khác trên thế giới? –

+1

@Uwe: Có, nó [không] (http://www.ozonehouse.com/mark/periodic/) – hugomg

1

Lý do đầu tiên là ngôn ngữ cho phép bạn đạt được mục tiêu của mình bằng biểu mẫu "tiết". Sau đó nó được cau mày khi thêm các toán tử cho mỗi và mọi trường hợp bất thường. Một phần lý do là, rằng các nhà thiết kế ngôn ngữ phải quyết định về tiền lệ của nhà điều hành một cách khôn ngoan. Đây không phải là dễ dàng như nó trông giống như - lấy C là một ví dụ mà gây rối lên các ưu tiên trực quan trên &, |, &&||.

Lý do thứ hai là hầu hết các ngôn ngữ hiện đại đều hỗ trợ một số ngoại lệ. Trường hợp của bạn có thể dễ dàng được viết lại bằng cách sử dụng ngoại lệ với phần thưởng thêm, thông tin về lỗi có thể được chuyển đến người gọi dễ dàng hơn.

Do đó, nhu cầu đối với nhà điều hành đặc biệt như thế này là khá nhỏ.

Ồ, tôi gần như đã bỏ lỡ lý do quan trọng nhất: C không có chúng. Điều này có nghĩa là gì nhất được mô tả trong A Brief, Incomplete, and Mostly Wrong History of Programming Languages:

1970 - Niklaus Wirth tạo Pascal, một ngôn ngữ thủ tục. Các nhà phê bình ngay lập tức tố cáo Pascal vì nó sử dụng cú pháp "x: = x + y" thay vì C-like "x = x + y" quen thuộc hơn. Sự chỉ trích này xảy ra bất chấp thực tế là C chưa được phát minh.

1972 - Dennis Ritchie phát minh ra một khẩu súng mạnh mẽ bắn cả hai phía trước và lùi lại đồng thời. Không hài lòng với số lượng người chết và những thương tích vĩnh viễn từ phát minh đó mà ông phát minh ra C và Unix.

Điều này đơn giản chỉ ra rằng C vẫn là một người thu hút bạn không thể trốn thoát.

+0

Tôi vẫn không hiểu tại sao có "hầu hết là sai" trong tiêu đề đó. : P – hugomg

+0

Bất kỳ bình luận nào cho downvote (r)? –

0

Không giống như + = và bạn bè, & & = không ánh xạ tới một hướng dẫn phần cứng đơn lẻ. Đó là một loại thử nghiệm hay rõ ràng.