Có một từ khóa hoặc nhà điều hành cho hay không?


56

Có một nhà điều hành tương đương cũng không ? Ví dụ, màu yêu thích của tôi không phải là màu xanh lá cây hay màu xanh.

Và mã sẽ tương đương với:

// example one
if (color!="green" && color!="blue") { 

}

// example two
if (x nor y) {
    // x is false and y is false
}

12
Không, bởi vì chúng tôi đã có or!, bởi vì tiêu cực kép hiếm khi được sử dụng - hầu hết mọi người đều thấy chúng đặc biệt khó đọc.
Kilian Foth

70
@KilianFoth nói đúng. Tuy nhiên, downvote nên dành cho câu hỏi xấu, không phải cho câu hỏi chúng tôi không thích. Hơn nữa, đã có ba phiếu để đóng câu hỏi vì nó sẽ là "dựa trên ý kiến", mặc dù câu hỏi hoàn toàn trung lập và không gây tranh cãi (có những nhà khai thác như vậy trong một số ngôn ngữ kỳ lạ hoặc không có).
Barshe

3
Có một cái tên cho nó? Có: cũng không. Có phải là một nhà điều hành? Trong ngôn ngữ nào? Và được cung cấp một ngôn ngữ, bạn có thể tra cứu nó trong thông số / tài liệu.
jonrsharpe

9
@Troyer Nhận xét của bạn thể hiện vấn đề: bạn đã logic sai. ;) Điều đó không tương đương với cũng không.
jpmc26

3
Trong các ngôn ngữ có nhiều toán tử hơn, điều này sẽ là (ví dụ: bằng python)color not in ['green', 'blue']
Izkata

Câu trả lời:


71

Mặc dù các ngôn ngữ chính không có các nhà khai thác NOR và NAND chuyên dụng, một số ngôn ngữ ít được biết đến (ví dụ, một số ngôn ngữ "chơi gôn"). Ví dụ, APLcho NOR và NAND, tương ứng.

Một lớp ví dụ khác có thể được tìm thấy trong các ngôn ngữ thiết kế phần cứng như VHDL , Verilog , v.v ... Cổng NAND và NOR khá hữu ích trong thiết kế phần cứng do thường rẻ hơn (yêu cầu ít bóng bán dẫn hơn) so với mạch tương đương được tạo từ AND / OR / NOT cổng, một trong những lý do ngôn ngữ thiết kế phần cứng có xu hướng bao gồm chúng; một lý do khác là chúng có thể hữu ích cho các thủ thuật xử lý bit nhất định.


40
APL không phải là một ngôn ngữ chơi gôn , mà là một ngôn ngữ định hướng mảng cho phép phát triển tương tác các ứng dụng đa mô hình đầy đủ với sức mạnh công nghiệp.
Adám

59
@ Adám: Chơi lô .
Eric Duminil

6
@EricDuminil :-) Tất cả đều đúng.
Adám

20
@EricDuminil Không, thật đấy. APL không phải là một ngôn ngữ chơi gôn, nó là một ngôn ngữ thực tế có thể chơi golf tốt. Perl là tương tự về vấn đề này, không?
Pavel

13
OP đã không thực sự nói rằng APL là một ngôn ngữ chơi gôn của người Viking, btw.
Will Crawford

45

Không, không có nortoán tử trong bất kỳ ngôn ngữ lập trình chính cấp cao nào.

Tại sao ?

Chủ yếu là vì nó khó đọc:

  • nó đòi hỏi sự kết hợp tinh thần của một số toán tử (" và không ", hoặc theo phong cách văn học hơn: " tiêu cực hơn nữa ", " mỗi không đúng sự thật " )
  • nó ngụ ý một ẩn nottrên toán hạng đầu tiên, nhưng người đọc chỉ hiểu điều này sau đó
  • nó khác với ngôn ngữ của con người, sử dụng một phủ định rõ ràng trên toán hạng đầu tiên, chẳng hạn như " không x cũng không phải y ", " cũng không phải x hay y ". Vì vậy, một người đọc có thể nhầm lẫn (x nor y)với (x and not y)thay vì((not x) and (not y))
  • một số độc giả nhầm lẫn với orngữ nghĩa rõ ràng không áp dụng

Nhưng nó rất phổ biến trong phần cứng ...

norlà một cổng phần cứng cơ bản có thể được sử dụng để tạo ra tất cả các cổng logic khác. Vì vậy, người ta có thể lập luận rằng tất cả các toán tử logic khác là các kết hợp và norlà toán tử logic cơ bản đơn giản nhất.

Tuy nhiên, những gì đúng với phần cứng không nhất thiết đúng với con người. Và mặc dù nó phổ biến ở cấp độ phần cứng, một số CPU chính thống thậm chí không cung cấp một NORbộ hướng dẫn trình biên dịch chương trình (ví dụ x86 ).

Lựa chọn thay thế

Vấn đề dễ đọc. Và đôi khi nó có thể được cải thiện bằng các phương tiện khác.

Sử dụng các toán tử hiện có

Ví dụ:

if x not in [1,2]    // use of 'in' or 'not in' operator instead of x!=1 and x!=2

Đặt hàng điều kiện

if x==1 or x==2 
     action A
else 
     action B  

thay vì

if x!=1 and x!=2 
    action B
else 
    action A

Sử dụng cho đến khi vòng lặp

Một số ngôn ngữ cũng cung cấp các hướng dẫn vòng lặp cho phép diễn đạt các điều kiện bằng whilehoặc với until, cho phép bạn chọn cách "tích cực" hơn. Những hướng dẫn này ví dụ until c do ...trong ruby , do until c ...trong vb , hoặc repeat ... until ctrong pascal và con cháu của mình.

Ví dụ:

Until (x==1 or x==2) do
     ...

tương đương với:

While (x!=1 and x!=2)
    ...

Tạo một chức năng

Bây giờ nếu bạn vẫn thích norcú pháp, bạn có thể xác định hàm, nhưng chỉ khi bạn không mong đợi một phím tắt xảy ra:

If ( nor(x,y) )   // attention, x and y will always be evaluated
    ...  

Có một lợi thế dễ đọc của hàm so với toán tử, bởi vì người đọc ngay lập tức hiểu rằng phủ định áp dụng cho tất cả các đối số. Trong một số ngôn ngữ, bạn có thể định nghĩa một hàm với số lượng đối số thay đổi.


5
Thật buồn cười, tôi thường viết rằng vì while (not (x == 1 or x == 2))tôi thấy x != 1 and x != 2phiên bản khó đọc và thấy "x không phải là 1, cũng không phải là 2" dễ xử lý hơn "x không phải là 1 và x không phải là 2".
Mael

1
@Baldrickk bạn có thể giải thích?
Hy vọng hữu ích

4
@Hop HopeHelpful Repeat... Untilluôn luôn thực thi thân vòng lặp ít nhất một lần. Nếu x là 1, thân vòng lặp vẫn được thực thi, nhưng không được lặp lại. Các Whilevòng lặp sẽ không thực hiện cơ thể trong trường hợp này.
sina

2
@Baldrickk vâng bạn hoàn toàn đúng. Khi tôi viết tương đương, tôi chỉ nói về điều kiện vòng lặp, vì các toán tử boolean là chủ đề của câu hỏi. Cảm ơn bạn, tôi sẽ điều chỉnh lại để làm rõ
Barshe

3
Wether x và y in nor(x,y)luôn được đánh giá tùy thuộc vào ngôn ngữ và cách nor()triển khai. Có các ngôn ngữ (D, Io, Nhận) trong đó hàm được gọi có thể quyết định xem và khi nào để đánh giá các đối số.
BlackJack

18

Nhận xét của @ KilianFoth về câu hỏi là tại chỗ.

Bạn có thể tổng hợp nortừ notor:

if (x nor y)

hoàn toàn giống như

if (not (x or y))

Giới thiệu nornhư một nhà điều hành riêng biệt sẽ giới thiệu các dự phòng cho ngôn ngữ, những thứ không cần thiết, cũng không muốn (hoặc - không cần thiết và không muốn).

Tương tự, tôi không biết bất kỳ ngôn ngữ nào có nandtoán tử - có lẽ bởi vì nó có thể được tổng hợp từ notandtoán tử.

Về lý thuyết, bạn có thể tạo một ngôn ngữ chỉ có nandhoặc chỉ các nortoán tử. Tất cả and, ornotsau đó bởi có thể synthesied từ họ. Vấn đề duy nhất là điều này sẽ vô cùng khó sử dụng. Ví dụ, xem logic NORlogic NAND trên Wikipedia.


4
Các khoản dự phòng cũng có thể không cần hoặc không muốn :)
Dave

@Dave Đó là ý định chơi chữ, rất vui khi thấy bạn chú ý ;-)
Mael

5
Dự phòng một mình không thực sự giải thích tại sao norkhông được bao gồm. Nếu không, tại sao ngôn ngữ có andor? Chúng dư thừa, nhờ De Morgan. Trong thực tế, bạn có thể thay thế tất cả ba nhà khai thác logic thông thường ( and, or, not) bằng cách cung cấp chỉ nor , như bạn một cách đúng đắn quan sát.
Konrad Rudolph

1
@KonradRudolph Về mặt kỹ thuật, tất cả những gì bạn cần là một toán tử lambda . Lý do chúng tôi làm nhiều hơn là để phù hợp với mô hình tinh thần mà hầu hết các lập trình viên có. Hầu hết các lập trình viên nghĩ về logic theo and, ornot- bởi vì đó là thứ mà hầu hết các ngôn ngữ của con người sử dụng. Khi bạn khớp với mô hình tinh thần của và / hoặc / không, thì cũng không & nand trở nên dư thừa. Sự dư thừa của chúng thậm chí được mã hóa trong tên của chúng: "n (ot) và" và "n (ot) hoặc". Nếu chúng ta có các thuật ngữ tiếng Anh riêng biệt, có sẵn cho chúng, và không chỉ các thuật ngữ tổng hợp, thì có lẽ bạn sẽ thấy chúng thường xuyên hơn.
RM

1
Re dư thừa như lập luận: Có những ngôn ngữ với hơn not, and, or. Ví dụ, một số phương ngữ BASIC (GW-BASIC, QuickBASIC, Nhận) có độc quyền hoặc XOR, hàm ý IMP (→ KHÔNG (x XOR y)) và EQV tương đương (→ KHÔNG (x) HOẶC y) như các toán tử bổ sung.
BlackJack

11

Có, APL và một số phương ngữ của nó không có (và nand ). Trong APL, cũng không được ký hiệu (vì hay~không ):

 resultExampleOne color
  :If (color'green')⍱(color'blue')
      result'warm'
  :Else
      result'cold'
  :EndIf


 resultExampleTwo(x y)
  :If xy
      result'x is false and y is false'
  :Else
      result'at least one of them is true'
  :EndIf

Hãy thử trực tuyến!


10

Câu trả lời này là từ ngôn ngữ trình biên dịch cho một máy tính được sản xuất vào giữa những năm 1960. Điều đó khá mơ hồ, nhưng trong một số khía cạnh, nó giải quyết câu hỏi của bạn.

DEC (Tập đoàn thiết bị kỹ thuật số) đã ra mắt máy tính PDP-6 vào giữa những năm 1960. Máy này có tổng cộng 64 lệnh là các phép toán boolean trên hai toán hạng (bao gồm cả một số trường hợp suy biến). 64 hướng dẫn này thực sự là 16 toán tử với 4 biến thể trong mỗi toán tử.

Hai trong số các toán tử, ANDCB và ORCB đã triển khai NOR và NAND tương ứng (trừ khi tôi trộn lẫn vào logic âm kép). Bạn có thể thấy bảng opcode . Bảng opcode thực sự dành cho máy tính PDP-10, một sự kế thừa cho PDP-6.

Nếu bạn nhìn vào hướng dẫn số trong nhị phân, nó sẽ thú vị hơn. Nó chỉ ra rằng đối với tất cả các opcodes trong phạm vi 400-477 (bát phân), bốn bit trong chính lệnh cung cấp một bảng chân lý bốn bit cho 16 toán tử boolean có thể. Một số toán tử này bỏ qua một hoặc cả hai đầu vào. Ví dụ: SETZ và SETO bỏ qua cả hai đầu vào.

Các nhà thiết kế của PDP-6 đã khai thác thực tế này để thực hiện tất cả các hướng dẫn này với ít logic hơn so với việc thực hiện chỉ một số trong số chúng. Một số trong những hướng dẫn này hiếm khi xuất hiện trong mã ngôn ngữ lắp ráp. Nhưng tất cả đều ở đó.

Vậy ANDCB tương đương với NOR. (một lần nữa, trừ khi tôi có logic ngược, trong trường hợp này ORCB là tương đương).


3

Perl có unlesstừ khóa cho phép bạn đảo ngược các điều kiện:

unless ($color eq 'green' or $color eq 'blue') {
    # code
}

Mặc dù không phải là nhà điều hành NOR, bạn có thể thể hiện ý định của mình theo cách tương tự.


3

Các nornhà điều hành như bạn mô tả nó sẽ không được lặp lại, đó là ràng buộc để dẫn đến rất nhiều khó khăn để phát hiện lỗi.

"Ví dụ 2" của bạn về cơ bản là thế này:

if (false nor false) {
becomes
if (true) {

Nhưng hãy thử lại với ba biến và xem điều gì sẽ xảy ra:

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
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.