Các phiên bản viết của các toán tử logic


94

Đây là nơi duy nhất mà tôi từng thấy and, ornotđược liệt kê như các nhà khai thác thực tế trong C ++. Khi tôi viết một chương trình thử nghiệm trong NetBeans, tôi nhận được gạch dưới màu đỏ như thể có lỗi cú pháp và nhận ra rằng trang web đã sai, nhưng đó là NetBeans đã sai vì nó đã được biên dịch và chạy như mong đợi.

Tôi có thể thấy !được ưu ái hơn notnhưng khả năng đọc của and&& ordường như lớn hơn các anh em ngữ pháp của chúng. Tại sao các phiên bản của toán tử logic này lại tồn tại và tại sao dường như không ai sử dụng nó? Đây có phải là C ++ thực sự hợp lệ hay một số loại tương thích với C được bao gồm trong ngôn ngữ này?


4
\ me Viết lại tất cả mã của anh ấy
Chuộc tội có giới hạn vào

2
Với tinh thần "mã sạch", cá nhân tôi khuyên bạn nên bỏ thói quen viết ||&&thậm chí có thể là !đôi khi. Các từ luôn tốt hơn khi đó là "nhiễu dòng", chưa kể đến sự nhầm lẫn có thể xảy ra với các toán tử thao tác bit.
Ichthyo

2
@Ichthyo Điều đó không phải lúc nào cũng chính xác. Đọc nhiều ký hiệu và biết ý nghĩa của chúng là cách nhanh hơn là đọc nhiều từ.
vallentin

những gì rõ ràng hơn đối với một người đọc phụ thuộc vào "Gestalt". Đôi khi một biểu tượng có thể rõ ràng hơn một số cụm từ bị xáo trộn, nhưng trong trường hợp này thì không. Và, lời nói đơn giản của ngôn ngữ tiếng Anh là cách nhiều phổ quát hơn một số biểu tượng đặc biệt kỳ lạ của một ngôn ngữ lập trình hơi lạ ...
Ichthyo

3
Điều trớ trêu là nói rằng anddễ đọc hơn và sau đó viết " and&& or" mặc dù :)
Ivan Vergiliev

Câu trả lời:


111

Chúng có nguồn gốc từ C trong tiêu đề <iso646.h>. Vào thời điểm đó, có những bàn phím không thể nhập các ký hiệu bắt buộc cho &&(ví dụ), vì vậy tiêu đề chứa #definecác ký tự sẽ hỗ trợ họ làm như vậy, bằng cách (trong ví dụ của chúng tôi) xác định and&&. Tất nhiên, thời gian trôi qua, điều này trở nên ít được sử dụng hơn.

Trong C ++, chúng trở thành thứ được gọi là mã thông báo thay thế . Bạn không cần phải bao gồm bất kỳ thứ gì để sử dụng các mã thông báo này trong một trình biên dịch tuân thủ (chẳng hạn, phiên bản C ++ - ified của tiêu đề C <ciso646>, là trống). Các mã thông báo thay thế cũng giống như các mã thông thường, ngoại trừ chính tả. Vì vậy, trong quá trình phân tích cú pháp andchính xác giống như &&, nó chỉ là một cách khác nhau của chính tả điều tương tự.

Về công dụng của chúng: vì chúng ít được sử dụng nên việc sử dụng chúng thường gây nhiều ngạc nhiên và khó hiểu hơn là hữu ích. Tôi chắc rằng nếu nó là bình thường, chúng sẽ dễ đọc hơn nhiều, nhưng mọi người đã quá quen &&||bất cứ điều gì khác chỉ làm mất tập trung.

CHỈNH SỬA: Tuy nhiên, tôi đã thấy sự gia tăng rất ít trong việc sử dụng chúng kể từ khi tôi đăng bài này. Tôi vẫn tránh chúng.


Vì vậy, việc giải thích các mã thông báo thay thế này chỉ là một tính năng của trình biên dịch hay nó nằm trong đặc tả C ++?
khiếm khuyết

2
@Kavon: Nó được quy định trong phần 2.5 của tiêu chuẩn; đó là một tính năng ngôn ngữ.
GManNickG

15
Cá nhân tôi nghĩ rằng chúng tốt hơn nhiều ... nhưng sau đó tôi lại thiên vị Python. Tôi không biết tại sao một số người nói rằng nếu nó không bị cắt xén thì nó không phải là mã ...
Matthieu M.

Vì vậy, những điều này không hợp lệ trong C mà không bao gồm tệp tiêu đề đó? Tôi ngạc nhiên rằng chúng không được sử dụng bởi tất cả mọi người; chúng làm cho Python dễ đọc hơn rất nhiều.
endolith

1
Ít nhất Visual Studio 2015 CTP 6 không thích của tôi orhoặc notkhông bao gồm tiêu đề.
usr1234567

18

Chúng tồn tại vì khả năng sử dụng (hỗ trợ ký tự trong bàn phím / hiển thị) và khả năng đọc chung, nhưng có một lý do khác mà ngày nay rõ ràng hơn. Hầu như không có câu trả lời nào ở đây , ở đây , hoặc thậm chí là câu trả lời chính ở đâychỉ ra lý do cốt lõi khiến nhiều người trong chúng ta thích các phiên bản từ hơn các phiên bản ký hiệu (và một lý do chính mà các ngôn ngữ khác sử dụng chúng): lỗi. Sự khác biệt giữa các phiên bản từ là rất rõ ràng. Sự khác biệt giữa các phiên bản biểu tượng là ít hơn rõ rệt, đến mức hấp dẫn các lỗi ở một mức độ tương đối lớn hơn nhiều: "x | y" rất nhiều không phải "x || y", nhưng khi được nhúng vào một biểu thức lớn hơn, nhiều người trong chúng ta bỏ lỡ sự khác biệt. Nó tương tự như sự trộn ngẫu nhiên phổ biến của toán tử gán và bình đẳng. Vì lý do này, tôi đã từ bỏ các phiên bản biểu tượng (điều đó không dễ dàng) để ủng hộ các phiên bản từ. Tôi thà để ai đó làm đôi chúng do tình yêu của chúng tôi với những thứ cũ kỹ hơn là lỗi cám dỗ.


4
Thật không may, trong Visual Studio (kể từ VS2013), bạn phải đặt một tùy chọn trình biên dịch cụ thể ( /Za) để hỗ trợ các từ khóa thay thế (xem stackoverflow.com/a/555524/368896 ). Điều đó có lẽ cũng có những tác động khác. Vì vậy, trong Visual Studio, không nhất thiết phải an toàn khi thực hiện lời khuyên này.
Dan Nissenbaum

FWIW / - khi tôi đặt dấu cách xung quanh các toán tử, x | yđủ rõ ràng về mặt trực quan (trong phông chữ đơn khoảng cách) x || y, nhưng tôi thấy !ví dụ như if (!f(xyz) && ...dễ bỏ sót hơn if (not f(xyz) && ....
Tony Delroy

@Tony D khi bạn đặt dấu cách xung quanh các toán tử, đó là quy ước riêng của bạn và người đọc không rõ ràng. Nhưng sử dụng những từ ngôn ngữ tự nhiên thích and, ornottrong một biểu thức boolean, thực sự cải thiện khả năng đọc cộng với nó làm nổi bật sự khác biệt để thao tác bit. Vì vậy, IMHO chúng ta nên cân nhắc để thay đổi những thói quen cũ yêu quý của mình để tốt hơn ...
Ichthyo

@DanNissenbaum tôi thấy tùy chọn này dưới cái tên C / C ++> Ngôn ngữ> Tắt Ngôn ngữ Extensions , vì vậy nó là tương đối an toàn để mong đợi phản ứng phụ;)
Wolf

6
Bạn có biết bao nhiêu lỗi Python đã được giới thiệu vì những lời nói andorsuy nghĩ của mọi người về cách chúng hoạt động không? Ví dụ: if (a == b or c)thay vì if (a == b || a == c)- một cái gì đó như thế này xuất hiện hầu như mỗi ngày tại StackOverflow. Các ký hiệu trừu tượng được ngắt kết nối với ngôn ngữ tiếng Anh sẽ giảm bớt những lỗi này.
Mark Ransom

10

Trong C ++, chúng là các từ khóa thực. Trong C, chúng là các macro được định nghĩa trong <iso646.h>. Xem http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html .


6
Về mặt kỹ thuật, chúng là các mã thông báo thay thế, không phải từ khóa. :)
GManNickG

2
@GMan: +1 Tuyệt vời, tuy nhiên, trang Dinkumware gọi chúng là từ khóa, vì vậy, tôi cho rằng họ không quan tâm quá nhiều đến sự khác biệt.
Chris Jester-Young


Vậy MSVC có hỗ trợ chúng trong C ++ nhưng không hỗ trợ trong C không?
thứ hai

1
@rwst Tôi không thể bình luận cụ thể về MSVC, nhưng nếu nó thực hiện các tiêu chuẩn C ++ và C một cách trung thực, thì đó thực sự sẽ là trường hợp. Xem thêm: stackoverflow.com/questions/2376448/…
Chris Jester-Young,

2

and&&giống nhau về mặt chức năng trong C ++. Các andorcác nhà khai thác đang thực sự có giá trị C ++ và một phần của tiêu chuẩn ngôn ngữ.

Để giải thích thêm về các câu trả lời khác với một ví dụ cụ thể, có một lý do khác ngoài "khả năng đọc" để thích andhơn &&. Đánh vần "và" một cách rõ ràng khi AND hợp lý là ý bạn muốn loại trừ khả năng có lỗi nhỏ.

Xem xét điều này:

int x = 3;
int y = 4;

// Explicitly use "and"
if (x and y) {
    cout << "and: x and y are both non-zero values" << endl;
}

// Using "&&"
if (x && y) {
    cout << "&&: x and y are both non-zero values" << endl;
}

// Oops! I meant to type "&&"!
if (x & y) {
    cout << "&: x and y are both non-zero values" << endl;
}
else {
    cout << "How did I get here?" << endl;
}

Cả ba câu lệnh if sẽ biên dịch, nhưng câu lệnh cuối cùng có nghĩa là một cái gì đó hoàn toàn khác và không theo ý muốn!

Nếu bạn luôn sử dụng andkhi bạn có nghĩa là AND logic, bạn không bao giờ có thể vô tình nhập một "&" duy nhất và mã của bạn được biên dịch thành công và chạy với các kết quả bí ẩn.

Một bài tập hay khác: Thử bỏ qua một ký tự của "và" một cách tình cờ và xem điều gì sẽ xảy ra. ;)


1
Đây không thực sự là một câu trả lời cho câu hỏi. Chỉ là bạn nói rõ những gì bạn cảm thấy dễ đọc hơn. OP hỏi về cách thức hoạt động của các phiên bản viết, không phải phiên bản nào tốt hơn. Và ai đó cũng đã đưa ra cùng quan điểm mà bạn đang cố gắng đưa ra.
Nicol Bolas

Không phải là nó thực sự cung cấp thêm bất kỳ thông tin hữu ích nào nhưng tôi sẽ thêm " and&&giống hệt về mặt chức năng" vào câu trả lời ... Và nếu bạn đọc câu trả lời của tôi, bạn sẽ thấy rằng tôi đang nói KHÔNG về tính dễ đọc;)
tjwrona1992
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.