Lệnh Linux / Unix: expr

Tên

expr - Đánh giá biểu thức

Tóm tắc

expr arg ? arg arg ... ?

Kết hợp arg (thêm dấu cách giữa chúng), đánh giá kết quả dưới dạng biểu thức Tcl và trả về giá trị. Các toán tử được cho phép trong các biểu thức Tcl là một tập con của các toán tử được cho phép trong các biểu thức C, và chúng có cùng ý nghĩa và ưu tiên như các toán tử C tương ứng. Biểu thức hầu như luôn mang lại kết quả số (giá trị số nguyên hoặc dấu phẩy động). Ví dụ, biểu thức

expr 8.2 + 6

đánh giá đến 14.2. Các biểu thức Tcl khác với các biểu thức C theo cách mà các toán hạng được xác định. Ngoài ra, biểu thức Tcl hỗ trợ toán hạng không phải là số và so sánh chuỗi.

Toán tử

Biểu thức Tcl bao gồm kết hợp các toán hạng, toán tử và dấu ngoặc đơn. Không gian trắng có thể được sử dụng giữa các toán hạng và toán tử và dấu ngoặc đơn; nó bị bỏ qua bởi các chỉ dẫn của biểu thức. Khi có thể, toán hạng được hiểu là giá trị số nguyên. Giá trị nguyên có thể được xác định bằng số thập phân (trường hợp bình thường), trong bát phân (nếu ký tự đầu tiên của toán hạng là 0 ), hoặc trong hệ thập lục phân (nếu hai ký tự đầu tiên của toán hạng là 0x ). Nếu toán hạng không có một trong các định dạng số nguyên được cho ở trên, thì nó được coi là một số dấu phẩy động nếu có thể. Số dấu phẩy động có thể được chỉ định theo bất kỳ cách nào được chấp nhận bởi trình biên dịch C tuân thủ ANSI (ngoại trừ các hậu tố f , F , lL sẽ không được phép trong hầu hết các cài đặt). Ví dụ, tất cả những điều sau đây là các số dấu phẩy động hợp lệ: 2.1, 3., 6e4, 7.91e + 16. Nếu không thể giải thích bằng số, thì toán hạng được để lại dưới dạng một chuỗi (và chỉ có một nhóm toán tử giới hạn có thể được áp dụng cho nó).

Các toán tử có thể được chỉ định theo bất kỳ cách nào sau đây:

[1]

Là một giá trị số, số nguyên hoặc dấu phẩy động.

[2]

Là biến Tcl, sử dụng ký hiệu $ chuẩn. Giá trị của biến sẽ được sử dụng làm toán hạng.

[3]

Như một chuỗi được đặt trong dấu ngoặc kép. Trình phân tích cú pháp biểu thức sẽ thực hiện các dấu gạch chéo ngược, biến và lệnh thay thế trên thông tin giữa các dấu ngoặc kép và sử dụng giá trị kết quả là toán hạng

[4]

Như một chuỗi kèm theo trong niềng răng. Các ký tự giữa dấu ngoặc mở và dấu ngoặc nhọn phù hợp sẽ được sử dụng làm toán hạng mà không có bất kỳ thay thế nào.

[5]

Như một lệnh Tcl kèm theo trong ngoặc đơn. Lệnh sẽ được thực hiện và kết quả của nó sẽ được sử dụng như toán hạng.

[6]

Là một hàm toán học mà các đối số của nó có bất kỳ dạng nào ở trên cho các toán hạng, chẳng hạn như sin ($ x) . Xem dưới đây để biết danh sách các hàm đã xác định.

Trường hợp thay thế xảy ra ở trên (ví dụ: bên trong chuỗi được trích dẫn), chúng được thực hiện theo hướng dẫn của biểu thức. Tuy nhiên, một lớp bổ sung thay thế có thể đã được thực hiện bởi trình phân tích cú pháp lệnh trước khi bộ xử lý biểu thức được gọi. Như được thảo luận dưới đây, tốt nhất là nên kèm theo các biểu thức trong dấu ngoặc để ngăn trình phân tích cú pháp lệnh thực hiện các thay thế trên nội dung.

Đối với một số ví dụ về các biểu thức đơn giản, giả sử biến a có giá trị 3 và biến b có giá trị 6. Sau đó, lệnh ở bên trái của mỗi dòng bên dưới sẽ tạo ra giá trị ở bên phải của dòng:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * [llength "6 2"] 8 expr {{word one} <"word $ a"} 0

Nhà khai thác

Các toán tử hợp lệ được liệt kê bên dưới, được nhóm theo thứ tự ưu tiên giảm dần:

- + ~!

Unary trừ, unary plus, bit-wise NOT, NOT hợp lý. Không có toán hạng nào trong số các toán hạng này có thể được áp dụng cho các toán hạng chuỗi, và NOT khôn ngoan chỉ có thể được áp dụng cho các số nguyên.

* /%

Nhân, chia, còn lại. Không thể áp dụng toán hạng nào cho các toán hạng chuỗi và phần còn lại chỉ có thể được áp dụng cho các số nguyên. Phần còn lại sẽ luôn có cùng dấu như số chia và giá trị tuyệt đối nhỏ hơn số chia.

+ -

Cộng và trừ. Có giá trị cho bất kỳ toán hạng số nào.

<< >>

Trái và phải thay đổi. Chỉ hợp lệ cho toán hạng số nguyên. Một sự thay đổi đúng luôn truyền bá bit dấu.

<> <=> =

Boolean nhỏ hơn, lớn hơn, nhỏ hơn hoặc bằng nhau và lớn hơn hoặc bằng nhau. Mỗi toán tử tạo 1 nếu điều kiện là đúng, 0 ngược lại. Các toán tử này có thể được áp dụng cho các chuỗi cũng như toán hạng số, trong đó so sánh chuỗi trường hợp được sử dụng.

==! =

Boolean bằng nhau và không bằng nhau. Mỗi toán tử tạo ra một kết quả bằng không / một. Có giá trị cho tất cả các loại toán hạng.

&

Bit-khôn ngoan và. Chỉ hợp lệ cho toán hạng số nguyên.

^

OR độc quyền bit. Chỉ hợp lệ cho toán hạng số nguyên.

|

Bit-khôn ngoan HOẶC. Chỉ hợp lệ cho toán hạng số nguyên.

&&

Logic và. Tạo ra 1 kết quả nếu cả hai toán hạng đều khác 0, nếu không. Chỉ hợp lệ cho toán hạng boolean và số (số nguyên hoặc dấu phẩy động).

||

Hợp lý HOẶC. Tạo ra một kết quả 0 nếu cả hai toán hạng bằng không, 1 nếu không. Chỉ hợp lệ cho toán hạng boolean và số (số nguyên hoặc dấu phẩy động).

x ? y : z

Nếu-thì-người khác, như trong C. Nếu x đánh giá không khác, thì kết quả là giá trị của y . Nếu không, kết quả là giá trị của z . Toán hạng x phải có giá trị số.

Xem hướng dẫn sử dụng C để biết thêm chi tiết về kết quả được tạo ra bởi mỗi nhà điều hành. Tất cả nhóm toán tử nhị phân từ trái sang phải trong cùng một mức độ ưu tiên. Ví dụ, lệnh

expr 4 * 2 <7

trả về 0.

The && , || , và?: toán tử có `'đánh giá lười' ', giống như trong C, có nghĩa là toán hạng không được đánh giá nếu chúng không cần thiết để xác định kết quả. Ví dụ, trong lệnh

expr {$ v? [a]: [b]}

chỉ một [a] hoặc [b] thực sự được đánh giá, tùy thuộc vào giá trị của $ v . Tuy nhiên, lưu ý rằng điều này chỉ đúng nếu toàn bộ biểu thức được đặt trong dấu ngoặc; nếu không, trình phân tích cú pháp Tcl sẽ đánh giá cả [a][b] trước khi gọi lệnh expr .

Chức năng toán học

Tcl hỗ trợ các hàm toán học sau đây trong các biểu thức:

abs cosh đăng nhập sqrt acos đôi log10 srand asin exp pow tan atan sàn rand tanh atan2 fmod vòng ceil hypot sin cos int sinh

abs ( arg )

Trả về giá trị tuyệt đối của arg . Arg có thể là số nguyên hoặc dấu phẩy động và kết quả được trả về trong cùng một biểu mẫu.

acos ( arg )

Trả về cosin cung của arg , trong phạm vi [0, pi] radian. Arg phải nằm trong phạm vi [-1,1].

asin ( arg )

Trả về sin cung của arg , trong phạm vi [-pi / 2, pi / 2] radian. Arg phải nằm trong phạm vi [-1,1].

atan ( arg )

Trả về tang tiếp tuyến của arg , trong phạm vi [-pi / 2, pi / 2] radian.

atan2 ( x, y )

Trả về tang tiếp tuyến của y / x , trong phạm vi [-pi, pi] radian. xy không thể là 0.

ceil ( arg )

Trả về giá trị số nguyên nhỏ nhất không nhỏ hơn arg .

cos ( arg )

Trả về cosin của arg , tính theo radian.

cosh ( arg )

Trả về cosin hyperbol của arg . Nếu kết quả sẽ gây tràn, lỗi sẽ được trả lại.

đôi ( arg )

Nếu arg là một giá trị thả nổi, trả về arg , nếu không chuyển đổi arg thành floating và trả về giá trị được chuyển đổi.

exp ( arg )

Trả về giá trị mũ của arg , được định nghĩa là e ** arg . Nếu kết quả sẽ gây tràn, lỗi sẽ được trả lại.

sàn ( arg )

Trả về giá trị tích phân lớn nhất không lớn hơn arg .

fmod ( x, y )

Trả về phần dư của dấu phẩy động của phép chia x theo y . Nếu y bằng 0, lỗi sẽ được trả về.

hypot ( x, y )

Tính toán chiều dài của cạnh huyền của một tam giác vuông góc ( x * x + y * y ).

int ( arg )

Nếu arg là một giá trị số nguyên, trả về arg , nếu không thì chuyển đổi arg thành số nguyên bằng cách cắt ngắn và trả về giá trị được chuyển đổi.

log ( arg )

Trả về logarit tự nhiên của arg . Arg phải là giá trị dương.

log10 ( arg )

Trả về logarit cơ số 10 của arg . Arg phải là giá trị dương.

pow ( x, y )

Tính toán giá trị của x được nâng lên lũy thừa y . Nếu x là âm, y phải là giá trị số nguyên.

rand ()

Trả về một số dấu phẩy động từ 0 đến chỉ bằng một hoặc, trong các thuật ngữ toán học, phạm vi [0,1). Hạt giống xuất phát từ đồng hồ bên trong của máy hoặc có thể được đặt bằng tay với chức năng srand.

vòng ( arg )

Nếu arg là một giá trị số nguyên, trả về arg , nếu không chuyển đổi arg thành số nguyên bằng cách làm tròn và trả về giá trị được chuyển đổi.

tội lỗi ( arg )

Trả về sin của arg , tính theo radian.

sinh ( arg )

Trả về sin hyperbol của arg . Nếu kết quả sẽ gây tràn, lỗi sẽ được trả lại.

sqrt ( arg )

Trả về căn bậc hai của arg . Arg phải không âm.

srand ( arg )

Các arg , mà phải là một số nguyên, được sử dụng để thiết lập lại các hạt giống cho các máy phát điện số ngẫu nhiên. Trả về số ngẫu nhiên đầu tiên từ hạt giống đó. Mỗi thông dịch viên có hạt giống riêng.

tan ( arg )

Trả về tang của arg , được đo bằng radian.

tanh ( arg )

Trả về tang hyperbol của arg .

Ngoài các hàm được xác định trước này, các ứng dụng có thể định nghĩa các hàm bổ sung bằng Tcl_CreateMathFunc ().

Các loại, tràn và độ chính xác

Tất cả các tính toán nội bộ liên quan đến số nguyên được thực hiện với loại C dài , và tất cả các tính toán nội bộ liên quan đến dấu phẩy động được thực hiện với loại C gấp đôi . Khi chuyển đổi một chuỗi thành dấu phẩy động, quá trình tràn số mũ được phát hiện và dẫn đến lỗi Tcl. Để chuyển đổi thành số nguyên từ chuỗi, phát hiện tràn phụ thuộc vào hành vi của một số thường trình trong thư viện C cục bộ, vì vậy nó nên được coi là không đáng tin cậy. Trong mọi trường hợp, tràn số nguyên và tràn thường không được phát hiện đáng tin cậy cho kết quả trung gian. Tràn tràn và tràn dòng được phát hiện ở mức độ được phần cứng hỗ trợ, thường khá đáng tin cậy.

Chuyển đổi giữa các biểu diễn nội bộ cho các toán hạng số nguyên, dấu phẩy động và chuỗi được thực hiện tự động khi cần. Đối với tính toán số học, số nguyên được sử dụng cho đến khi một số số dấu phẩy động được giới thiệu, sau đó sử dụng dấu phẩy động. Ví dụ,

expr 5/4

trả về 1, trong khi

expr 5 / 4.0 expr 5 / ([độ dài chuỗi "abcd"] + 0.0)

cả hai đều trả về 1,25. Giá trị dấu phẩy động luôn được trả về bằng `` . '' hoặc e để chúng không giống như giá trị số nguyên. Ví dụ,

expr 20.0 / 5.0

trả về 4.0 , không phải 4 .

Chuỗi hoạt động

Giá trị chuỗi có thể được sử dụng như toán hạng của toán tử so sánh, mặc dù bộ đánh giá biểu thức cố gắng so sánh làm số nguyên hoặc dấu phẩy động khi có thể. Nếu một trong các toán hạng của so sánh là một chuỗi và giá trị số khác có giá trị số, toán hạng bằng số được chuyển trở lại chuỗi bằng cách sử dụng trình định dạng sprintf của C % d cho số nguyên và % g cho giá trị dấu phẩy động. Ví dụ, các lệnh

expr {"0x03"> "2"} expr {"0y" <"0x12"}

cả hai trở lại 1. Việc so sánh đầu tiên được thực hiện bằng cách sử dụng so sánh nguyên, và thứ hai được thực hiện bằng cách so sánh chuỗi sau khi toán hạng thứ hai được chuyển đổi thành chuỗi 18 . Do xu hướng của Tcl coi giá trị là số bất cứ khi nào có thể, nên thường không nên sử dụng toán tử như == khi bạn thực sự muốn so sánh chuỗi và giá trị của toán hạng có thể tùy ý; tốt hơn trong những trường hợp này để sử dụng lệnh chuỗi thay thế.

Xem xét hiệu suất

Đính kèm các biểu thức trong niềng răng cho tốc độ tốt nhất và các yêu cầu lưu trữ nhỏ nhất. Điều này cho phép trình biên dịch bytecode Tcl tạo ra mã tốt nhất.

Như đã đề cập ở trên, các biểu thức được thay thế hai lần: một lần bởi trình phân tích cú pháp Tcl và một lần bằng lệnh expr . Ví dụ, các lệnh

đặt 3 bộ b {$ a + 2} expr $ b * 4

trả về 11, không phải bội số của 4. Điều này là do trình phân tích cú pháp Tcl đầu tiên sẽ thay thế $ a + 2 cho biến b , sau đó lệnh expr sẽ đánh giá biểu thức $ a + 2 * 4 .

Hầu hết các biểu thức không yêu cầu vòng thay thế thứ hai. Hoặc là chúng được bao bọc trong niềng răng hoặc, nếu không, biến thay thế và lệnh của họ mang lại số hoặc chuỗi mà bản thân chúng không yêu cầu thay thế. Tuy nhiên, vì một vài biểu thức không cần phải có hai vòng thay thế, trình biên dịch bytecode phải phát ra các hướng dẫn bổ sung để xử lý tình huống này. Mã đắt nhất là bắt buộc đối với các biểu thức không được chứa có chứa các thay thế lệnh. Các biểu thức này phải được thực hiện bằng cách tạo mã mới mỗi khi biểu thức được thực hiện.

Từ khóa

số học, boolean , so sánh, biểu thức, so sánh mờ

Quan trọng: Sử dụng lệnh man ( % man ) để xem cách một lệnh được sử dụng trên máy tính cụ thể của bạn.