Trong mã giả có nghĩa là gì: = có nghĩa là gì?


25

Phần có tên Thực hiện thuật toán có mã sau đây:

// Return RC low-pass filter output samples, given input samples,
 // time interval dt, and time constant RC
 function lowpass(real[0..n] x, real dt, real RC)
   var real[0..n] y
   var real α := dt / (RC + dt)
   y[0] := x[0]
   for i from 1 to n
       y[i] := α * x[i] + (1-α) * y[i-1]
   return y

không có nghĩa là gì?


2
Tôi đã học được rằng đó là từ triết học và ký hiệu logic, định nghĩa nó là ": = được định nghĩa là" vì vậy x: = 1 là x được định nghĩa là 1.
Patrick Hughes

3
Khi tôi học môn khoa học máy tính AP năm 1990, chúng tôi đã sử dụng Pascal làm ngôn ngữ học tập. Tôi luôn luôn phát âm :=là "trở nên bằng". Tôi thực sự thích điều này hơn ===vì "=" trong ngôn ngữ tự nhiên là một toán tử so sánh (hoặc ít nhất là một tuyên bố về sự thật.)
TecBrat

Câu trả lời:


59

: = là toán tử gán cho các ngôn ngữ sử dụng kiểm tra tính bằng dấu đơn. Những ngôn ngữ được biết đến nhiều nhất là Pascal. Do ảnh hưởng của C, hầu hết các ngôn ngữ đã chuyển sang = để gán và == để kiểm tra. Một số văn bản và tác giả cũ đã được đào tạo theo phong cách như vậy sử dụng: = cho mã giả. Đôi khi bạn thấy mũi tên <- cũng như để gán .

Từ bài viết:

input: an array a of length n with array elements numbered 0 to n − 1

inc ← round(n/2)
while inc > 0 do:
    for i = inc .. n − 1 do:
        temp ← a[i]
        j ← i
        while j ≥ inc and a[j − inc] > temp do:
            a[j] ← a[j − inc]
            j ← j − inc
        a[j] ← temp
    inc ← round(inc / 2.2)

Một số ngôn ngữ hiện đại sử dụng mũi tên để gán; đáng chú ý nhất là R , sử dụng nó cho phép gán toàn cục trong khi sử dụng một dấu bằng (=) cho phép gán cục bộ.

Từ các khái niệm về ngôn ngữ lập trình của Sebesta và các ghi chú trong lớp của Tiến sĩ KN King, chúng ta biết rằng các tiêu chuẩn chuyển nhượng trở lại xa hơn nhiều so với C hoặc Pascal. Có vẻ như vào năm 1958 khi Algol đang được thiết kế, nó đã được quyết định sử dụng: = để gán. Các ủy ban bao gồm các đại diện của Mỹ và châu Âu. Một số người Đức trong ủy ban đã quen thuộc với ngôn ngữ Plankalkul của Konrad Zuse (được soạn thảo trong Thế chiến II nhưng không được xuất bản cho đến năm 1972 và không được thực hiện cho đến năm 2005) và muốn chuyển nhượng theo phương pháp chuyển nhượng được đề xuất của ngôn ngữ đó.b+c => atrong đó b + c được gán cho a. Ủy ban đã thay đổi điều này thành =: với lý do phương thức nhập các chương trình tại thời điểm được gọi là keypunch, không có ">" để sử dụng. Vì vậy, họ thỏa hiệp trên dấu hai chấm. Tuy nhiên, người Mỹ đã quen thuộc với FORTRAN (không có chữ thường cho đến năm 1990) muốn nhiệm vụ hoạt động ở bên trái vì đó là cách mà FORTRAN đã làm.

Vì vậy, họ đã xoay sở để thay đổi nó thành: = thay vào đó và chuyển nhượng hoạt động sang bên trái thay vì bên phải theo kiểu FORTRAN (là ngôn ngữ được triển khai đã biết) thay vì Plankalkul (ngôn ngữ gần như không biết bên ngoài Đức và không được triển khai) . Algol 60 ảnh hưởng mạnh mẽ đến tất cả các ngôn ngữ mệnh lệnh lớn tiếp theo bao gồm Pascal và C. Do đó, Pascal giữ cú pháp của ALGOL cho bài tập và cả hai đều giữ nguyên khả năng chuyển nhượng.

ALGOL được thiết kế để dễ đọc và gần với ký hiệu toán học. Đó là tiêu chuẩn thực tế (và về cơ bản là de jure) để viết thuật toán trên các tạp chí trong hơn 20 năm tới. Do đó, các giảng viên và các nhà khoa học máy tính được giáo dục từ năm 1960 đến khoảng năm 1980 sẽ quen thuộc với kiểu ký hiệu đó.

Việc phát hành Keypunch của IBM 029 vào năm 1964 cho phép> và <ký tự, do đó thúc đẩy họ đưa vào C trong số những người khác.


1
Ngoài dấu chấm phẩy bị thiếu và trả về hàm, mã này dù sao trông giống như PASCAL, MODULA hoặc một số ngôn ngữ Wirth khác.
Ingo

7
hầu hết các mã giả sử dụng :=để gán. những người có nền tảng toán học cũng sẽ thích điều này.
oenone

3
Chỉ cần thêm rằng nó vẫn được sử dụng rất nhiều trong thực tế trong PL / SQL.
Jalayn

1
không biết tại sao, nhưng mũi tên trái làm nhiệm vụ chỉ khiến tôi phát điên 9
shabunc

2
Pascal (và phần còn lại của "ngôn ngữ Wirth") đã nhận được nó từ ALGOL, từ đó có được từ ký hiệu toán học.
Mason Wheeler

18

Chỉ cần một ghi chú nhanh chóng và pedantic. Mã giả khá không chính thức, vì vậy ": =" chỉ có nghĩa là bạn muốn nó có nghĩa gì. Như những người khác đã nói, các ngôn ngữ cụ thể như Pascal sử dụng ": =" để gán để tránh nhầm lẫn với "=" cho sự bình đẳng, trong khi các ngôn ngữ khác sử dụng kết hợp "=" và "==" cho cùng một mục đích.

Theo như Pseudocode thực tế có liên quan, bạn có thể sử dụng "=", "==", "bằng", "được gán cho", ": =", "has", "receive" hoặc bất cứ thứ gì nổi lên thuyền của bạn, chỉ miễn là bạn nhất quán, và cách sử dụng và bối cảnh nằm trong mã giả của bạn là rõ ràng.


6

Tôi đoán đó là phép gán (Tôi nghĩ đó là toán tử gán trong Delphi), vì vậy trong y [0]: = x [0] bạn đang gán giá trị của x [0] cho y [0].

Nhưng AFAIK không có thứ gọi là mã giả tiêu chuẩn , vì vậy về mặt lý thuyết, nó có thể là bất cứ thứ gì: =).


8
@loudsight: Bởi vì = đã có một ý nghĩa rất khác : bình đẳng. Sử dụng một toán tử đã có ý nghĩa được hiểu rõ cho một cái gì đó khác biệt sẽ là vô cùng ngu ngốc.
Jörg W Mittag

1
@ Jorg W Mittag Vâng tôi đoán nó phụ thuộc vào đối tượng dự định là ai. Tôi sẽ tưởng tượng cho hầu hết các nhà phát triển (Java, C / C ++, v.v.) = có nghĩa là gán.

5
@loudsight: Hầu hết các nhà phát triển thậm chí không được sinh ra, khi mã giả đầu tiên được viết. Trở lại sau đó, nó là hầu hết mọi người từ một nền toán học mạnh mẽ, người đã viết xuống các thuật toán, mà làm cho :=các lựa chọn tự nhiên, bởi vì trong ký hiệu toán học x := vcó nghĩa là "hãy để xđược v" như trái ngược với x = v, mà có nghĩa là " xtương đương v" và do đó sẽ gây ra sự nhầm lẫn.
back2dos

8
Nếu có một mã giả tiêu chuẩn, chúng ta sẽ thấy rất nhiều mã giả giả.

2
@ back2dos v.v ... Ngay cả ngày nay sử dụng =cho bài tập là khó hiểu. Tôi vẫn có thể nhớ, từ lâu khi tôi mới học lập trình, thật khó hiểu khi nhìn thấy nó x = x + 1. Một khi bạn đã học các môn toán cấp ba cơ bản, x = x + 1có vẻ như vô nghĩa mâu thuẫn. Tiếp theo tôi đọc một cuốn sách tuyệt vời về khoa học máy tính cho người đọc nói chung ( tôi nghĩ đó là cái này ) được sử dụng <-cho bài tập. x <- x + 1dễ hiểu hơn nhiều
MarkJ

-1

Nó thường có nghĩa tương tự như trong toán học: bài tập.


6
Không có thứ gọi là "bài tập" trong toán học theo hiểu biết của tôi.
Ingo

7
trong toán học, :=thường có nghĩa là "được định nghĩa là" hoặc "bằng định nghĩa".
oenone

3
@Ingo: "viết mẫu bit cho giá trị của biểu thức x vào một vị trí bộ nhớ có tên y" hoàn toàn khác với một phép gán trong các ngôn ngữ lập trình. Những gì bạn mô tả là một triển khai có thể thực hiện các câu lệnh gán.
back2dos

3
@Ingo: Tôi không đồng ý. Nói một cách thực tế, trong trường hợp thuộc tính, một phép gán mang lại một cuộc gọi và thực tế là một phần lớn mã được thực thi trong các máy ảo hoặc bởi các trình thông dịch, thay vì trực tiếp trên "kiến trúc hiện tại", thậm chí là gán cho các biến không cần phải dẫn đến một hoạt động như vậy, do tối ưu hóa. Với một vài ngoại lệ, một ngôn ngữ nên được sử dụng theo thông số kỹ thuật của nó và không dựa trên một số giả định về việc thực hiện nó. Tất cả những gì bạn thực sự có thể nói về các bài tập cho các biến là biến có tên y được phục hồi theo giá trị của biểu thức x.
back2dos

3
@Ingo: Không, nó không vô nghĩa. Biên dịch x := 1; y := 2; if (x = 1) y := 3như thể nó chỉ y := 3là một tối ưu hóa hợp lý (giả sử x không được sử dụng sau này). Trong số 3 bài tập 2 được thực hiện bằng phương pháp phân tích tĩnh. "Định nghĩa" bài tập của bạn là một tuyên bố chính thức, đơn giản là không giữ mà không có nhiều giả định, một định nghĩa về thuật ngữ này không cần phải phụ thuộc vào.
back2dos
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.