<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Tcl 中的表達式 > 原文: [https://zetcode.com/lang/tcl/expressions/](https://zetcode.com/lang/tcl/expressions/) 在 Tcl 教程的這一部分中,我們將討論表達式。 在 Tcl 語言中,表達式未內置到核心語言中。 而是使用`expr`命令對表達式求值。 表達式是根據操作數和運算符構造的。 表達式的運算符指示將哪些運算應用于操作數。 表達式中運算符的求值順序由運算符的優先級和關聯性確定。 運算符是特殊符號,表示已執行某個過程。 編程語言的運算符來自數學。 程序員處理數據。 運算符用于處理數據。 操作數是運算符的輸入(參數)之一。 下表顯示了 Tcl 語言中使用的一組運算符: | 類別 | 符號 | | --- | --- | | 按位,符號,邏輯非 | `- + ~ !` | | 求冪 | `**` | | 算術 | `+ - * / %` | | 移位 | `<< >>` | | 關系 | `== != < > <= >=` | | 字符串比較 | `eq ne` | | 列表 | `in ni` | | 按位 | `& &#124; ^` | | 布爾 | `&& &#124;&#124;` | | 三元 | `?:` | 一個運算符通常有一個或兩個操作數。 那些僅使用一個操作數的運算符稱為一元運算符。 那些使用兩個操作數的對象稱為二進制運算符。 還有一個三元運算符`?:`,它可以處理三個操作數。 ## 基本運算符 基本運算符是常用的運算符。 這些是符號運算符,算術運算符,模和冪運算符。 ```tcl #!/usr/bin/tclsh puts [expr +2] puts [expr -2] puts [expr -(-2)] puts [expr 2+2] puts [expr 2-2] puts [expr 2*2] puts [expr 2/2] puts [expr 2/2.0] puts [expr 2 % 2] puts [expr 2 ** 2] ``` 上面的示例顯示了 Tcl 中常用運算符的用法。 ```tcl puts [expr +2] ``` 在此代碼行中,我們使用加號運算符。 它對數量沒有影響。 它僅表示該數字為正。 可以將其省略,并且在大多數情況下可以將其省略。 ```tcl puts [expr -2] puts [expr -(-2)] ``` 負號運算符是強制性的。 它說數字是負數。 減號運算符更改數字的符號。 在第二行中,負號運算符將 -2 更改為正 2。 ```tcl puts [expr 2+2] puts [expr 2-2] puts [expr 2*2] puts [expr 2/2] ``` 上面的幾行顯示了常用的算術運算符。 ```tcl puts [expr 2 % 2] ``` % 是取模或余數的運算符。 它找到一個數除以另一個的余數。 表達式`2 % 2`,2 模 2 為 0,因為 2 一次變成 2,余數為 0。因此代碼行向控制臺輸出零。 ```tcl puts [expr 2 ** 2] ``` 這是求冪運算符。 代碼行將 4 打印到控制臺。 ```tcl $ ./exp.tcl 2 -2 2 4 0 4 1 1.0 0 4 ``` 示例的輸出。 ## 除法運算符 剛入門的程序員通常會因除法運算而感到困惑。 在許多編程語言中,有兩種除法運算:整數和非整數。 這也適用于 Tcl。 ```tcl % expr 3/2 1 % expr 3/2.0 1.5 ``` 注意整數除法和浮點除法之間的區別。 當至少一個操作數是浮點數時,結果也就是浮點值。 結果更加準確。 如果兩個操作數均為整數,則結果也為整數。 ## 賦值和增量運算符 Tcl 中沒有賦值運算符`=`,也沒有增量和減量(`++`和`--`)運算符。 這些運算符在其他計算機語言中很常見。 取而代之的是,Tcl 具有命令。 ```tcl % set a 5 5 % incr a 6 % incr a 7 % incr a -1 6 ``` 上面的代碼顯示了哪些命令用于實現缺少的運算符。 ```tcl % set a 5 ``` 在 Python 中,我們將執行`a = 5`。 在 Tcl 中,我們使用`set`命令將值設置為變量。 ```tcl % incr a 6 ``` 在 C,Java 和許多其他語言中,我們將通過以下方式將變量增加一個:`a++;`。 在 Tcl 中,我們使用`incr`命令。 默認情況下,該值增加 1。 ```tcl % incr a -1 6 ``` 上面的代碼顯示了如何將變量減 1,這由`--`減量運算符以基于 C 的語言完成。 ## 布爾運算符 在 Tcl 中,我們具有以下邏輯運算符: | 符號 | 名稱 | | --- | --- | | `&&` | 邏輯與 | | <code>&#124;&#124;</code> | 邏輯或 | | `!` | 否定 | 布爾運算符也稱為邏輯運算符。 ```tcl #!/usr/bin/tclsh set x 3 set y 8 puts [expr $x == $y] puts [expr $y > $x] if {$y > $x} { puts "y is greater than x" } ``` 許多表達式導致布爾值。 布爾值用于條件語句中。 ```tcl puts [expr $x == $y] puts [expr $y > $x] ``` 關系運算符始終導致布爾值。 這兩行顯示 0 和 1。在 Tcl 中,0 為`false`,任何非零值為`true`。 ```tcl if {$y > $x} { puts "y is greater than x" } ``` 僅當滿足括號內的條件時,才執行`if`命令的主體。 `$y > $x`返回 true,因此消息`"y`大于`x"`被打印到終端。 ```tcl #!/usr/bin/tclsh puts [expr 0 && 0] puts [expr 0 && 1] puts [expr 1 && 0] puts [expr 1 && 1] ``` 此示例顯示了邏輯和`&&`運算符。 僅當兩個操作數均為`true`時,它的求值結果為`true`。 ```tcl $ ./andoperator.tcl 0 0 0 1 ``` 如果兩個操作數中的任何一個為`true`,則邏輯或`||`運算符的計算結果為`true`。 ```tcl #!/usr/bin/tclsh puts [expr 0 || 0] puts [expr 0 || 1] puts [expr 1 || 0] puts [expr 1 || 1] ``` 如果運算符的任一側為真,則操作的結果為真。 ```tcl $ ./oroperator.tcl 0 1 1 1 ``` 否定運算符`!`將`true`設為`false`,并將`false`設為`false`。 ```tcl #!/usr/bin/tclsh puts [expr ! 0] puts [expr ! 1] puts [expr ! (4<3)] ``` 該示例顯示了否定運算符的作用。 ```tcl $ ./not.tcl 1 0 1 ``` `||`和`&&`運算符經過短路求值。 短路求值意味著僅當第一個參數不足以確定表達式的值時才求值第二個參數:當邏輯的第一個參數的值等于`false`時,總值必須為`false`; 當邏輯或的第一個參數為`true`時,總值必須為`true`。 短路求值主要用于提高性能。 一個例子可以使這一點更加清楚。 ```tcl #!/usr/bin/tclsh proc One {} { puts "Inside one" return false } proc Two {} { puts "Inside two" return true } puts "Short circuit" if { [One] && [Two] } { puts "Pass" } puts "###################" if { [Two] || [One] } { puts "Pass" } ``` 在示例中,我們有兩個過程。 (過程和條件將在后面描述。)它們在布爾表達式中用作操作數。 我們將看看它們是否被調用。 ```tcl if { [One] && [Two] } { puts "Pass" } ``` `One`過程返回`false`。 短路 `&&`不求值第二步。 沒有必要。 一旦操作數為假,邏輯結論的結果始終為假。 控制臺上僅打印`"Inside one"`。 ```tcl puts "###################" if { [Two] || [One] } { puts "Pass" } ``` 在第二種情況下,我們使用`||`運算符,并使用`Two`過程作為第一個操作數。 在這種情況下,`"Inside two"`和`"Pass"`字符串將打印到終端。 同樣,也不必求值第二個操作數,因為一旦第一個操作數計算為`true`,則邏輯或始終為`true`。 ```tcl $ ./shortcircuit.tcl Short circuit Inside one ################### Inside two Pass ``` `shorcircuit.tcl`腳本的結果。 ## 關系運算符 關系運算符用于比較值。 這些運算符總是產生布爾值。 在 Tcl 中,0 代表`false`,1 代表`true`。 關系運算符也稱為比較運算符。 | 符號 | 含義 | | --- | --- | | `<` | 小于 | | `<=` | 小于或等于 | | `>` | 大于 | | `>=` | 大于或等于 | | `==` | 等于 | | `!=` | 不等于 | 該表顯示了六個 Tcl 關系表達式。 ```tcl #!/usr/bin/tclsh puts [expr 3 < 4] puts [expr 3 == 4] puts [expr 4 >= 3] puts [expr 4 != 3] ``` 在 Tcl 中,我們使用`==`運算符比較數字。 某些語言(例如 Ada,Visual Basic 或 Pascal)使用`=`比較數字。 ```tcl $ ./rel.tcl 1 0 1 1 ``` 該示例打印四個布爾值。 ## 按位運算符 小數對人類是自然的。 二進制數是計算機固有的。 二進制,八進制,十進制和十六進制符號僅是相同數字的符號。 按位運算符使用二進制數的位。 像 Tcl 這樣的高級語言很少使用按位運算符。 | 符號 | 含義 | | --- | --- | | `~` | 按位取反 | | `^` | 按位異或 | | `&` | 按位與 | | <code>&#124;</code> | 按位或 | 按位取反運算符分別將 1 更改為 0,將 0 更改為 1。 ```tcl % puts [expr ~7] -8 % puts [expr ~-8] 7 ``` 運算符將 7 的所有位都還原。這些位之一還確定該數字是否為負。 如果我們再一次對所有位取反,我們將再次得到 7。 按位,運算符在兩個數字之間進行逐位比較。 僅當操作數中的兩個對應位均為 1 時,位位置的結果才為 1。 ```tcl 00110 & 00011 = 00010 ``` 第一個數字是二進制表示法 6,第二個數字是 3,結果是 2。 ```tcl % puts [expr 6 & 3] 2 % puts [expr 3 & 6] 2 ``` 按位或運算符在兩個數字之間進行逐位比較。 如果操作數中的任何對應位為 1,則位位置的結果為 1。 ```tcl 00110 | 00011 = 00111 ``` 結果為`00110`或十進制 7。 ```tcl % puts [expr 6 | 3] 7 % puts [expr 3 | 6] 7 ``` 按位互斥或運算符在兩個數字之間進行逐位比較。 如果操作數中對應位中的一個或另一個(但不是全部)為 1,則位位置的結果為 1。 ```tcl 00110 ^ 00011 = 00101 ``` 結果為`00101`或十進制 5。 ```tcl % puts [expr 6 ^ 3] 5 % puts [expr 3 ^ 6] 5 ``` ## 擴展運算符 擴展運算符`{*}`使列表中的每個項目成為當前命令的單獨參數。 列表是基本的 Tcl 數據結構; 在下一章中將進行介紹。 ```tcl #!/usr/bin/tclsh set nums {1 2 3 4 5 6} puts $nums puts [tcl::mathfunc::max {*}$nums] puts [tcl::mathfunc::min {*}$nums] ``` 擴展運算符與兩個數學函數一起使用。 ```tcl set nums {1 2 3 4 5 6} ``` 將創建一個名為`nums`的數字列表。 列表是值的有序集合。 ```tcl puts $nums ``` 列表的內容被打印到終端。 ```tcl puts [tcl::mathfunc::max {*}$nums] ``` `tcl::mathfunc::max`是標準的數學函數。 它不處理列表。 數字應作為單獨的參數傳遞。 擴展運算符將項目列表轉換為單個項目。 ```tcl $ ./expansion.tcl 1 2 3 4 5 6 6 1 ``` 示例輸出。 ## 運算符優先級 運算符優先級告訴我們首先求值哪個運算符。 優先級對于避免表達式中的歧義是必要的。 以下表達式 28 或 40 的結果是什么? ```tcl 3 + 5 * 5 ``` 像數學中一樣,乘法運算符的優先級高于加法運算符。 結果是 28。 ```tcl (3 + 5) * 5 ``` 我們使用括號來更改求值順序。 括號內的表達式始終首先被求值。 下表顯示了按優先級排序的常見 Tcl 運算符(最高優先級優先): | 類別 | 符號 | 關聯性 | | --- | --- | --- | | 按位,邏輯非 | `- + ~ !` | 左 | | 求冪 | `**` | 左 | | 算術 | `+ - * / %` | 左 | | 移位 | `<< >>` | 左 | | 關系 | `== != < > <= >=` | 左 | | 字符串比較 | `eq ne` | 左 | | 列表 | `in ni` | 左 | | 按位 | `& &#124; ^` | 左 | | 布爾 | `&& &#124;&#124;` | 左 | | 三元 | `?:` | 右 | 表的同一行上的運算符具有相同的優先級。 ```tcl !/usr/bin/tclsh puts [expr 3 + 5 * 5] puts [expr (3 + 5) * 5] puts [expr ! 1 || 1] puts [expr ! (1 || 1)] ``` 在此代碼示例中,我們顯示一些常見的表達式。 每個表達式的結果取決于優先級。 ```tcl puts [expr 3 + 5 * 5] ``` 該行打印 28。乘法運算符的優先級高于加法。 首先,計算`5*5`的乘積,然后加 3。 ```tcl puts [expr (3 + 5) * 5] ``` 圓括號可用于更改優先級。 在上面的表達式中,將 3 加到 5,然后將結果乘以 5。 ```tcl puts [expr ! 1 || 1] ``` 在這種情況下,否定運算符具有更高的優先級。 首先,第一個`true`(1)值取反為`false`(0),然后`||`運算符將`false`和`true`組合在一起,最后得到`true`。 ```tcl $ ./precedence.tcl 28 40 1 0 ``` 輸出。 ## 關聯性 有時,優先級不能令人滿意地確定表達式的結果。 還有另一個規則稱為關聯性。 運算符的關聯性確定優先級與相同的運算符的求值順序。 ```tcl 9 / 3 * 3 ``` 此表達式的結果是 9 還是 1? 乘法,刪除和模運算符從左到右關聯。 因此,該表達式的計算方式為:`(9 / 3) * 3`,結果為 9。 算術,布爾,關系和按位運算符都是從左到右關聯的。 三元運算符是正確關聯的。 ## 三元運算符 三元運算符`?:`是條件運算符。 對于要根據條件表達式選擇兩個值之一的情況,它是一個方便的運算符。 ```tcl cond-exp ? exp1 : exp2 ``` 如果`cond-exp`為`true`,則求值`exp1`并返回結果。 如果`cond-exp`為`false`,則求值`exp2`并返回其結果。 ```tcl #!/usr/bin/tclsh set age 32 set adult [expr $age >= 18 ? true : false] puts "Adult: $adult" ``` 在大多數國家/地區,成年取決于您的年齡。 如果您的年齡超過特定年齡,則您已經成年。 對于三元運算符,這是一種情況。 ```tcl set adult [expr $age >= 18 ? true : false] ``` 首先,求值賦值運算符右側的表達式。 三元運算符的第一階段是條件表達式求值。 因此,如果年齡大于或等于 18,則返回`?`字符后的值。 如果不是,則返回`:`字符后的值。 然后將返回值分配給成人變量。 ```tcl $ ./ternary.tcl Adult: true ``` 32 歲的成年人是成人。 ## 計算素數 我們將計算素數。 本教程的稍后部分將介紹一些功能(列表,循環)。 ```tcl #!/usr/bin/tclsh # primes.tcl set nums { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 } puts "Prime numbers:" foreach num $nums { if { $num==1 } { continue } if { $num==2 || $num==3 } { puts -nonewline "$num " continue } set i [expr int(sqrt($num))] set isPrime true while { $i > 1 } { if { $num % $i == 0 } { set isPrime false } incr i -1 } if { $isPrime } { puts -nonewline "$num " } } puts "" ``` 在上面的示例中,我們處理了許多不同的運算符。 質數(或質數)是大于 1 的自然數,具有正好兩個不同的自然數除數:1 和它本身。 我們拾取一個數字并將其除以數字,從 1 到拾取的數字。 實際上,我們不必嘗試所有較小的數字,我們可以將數字除以所選數字的平方根。 該公式將起作用。 我們使用余數除法運算符。 ```tcl set nums { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 } ``` 我們從該整數列表中計算素數。 ```tcl if { $num==1 } { continue } ``` 根據定義,1 不是質數。 `continue`命令跳到循環的下一個迭代。 ```tcl if { $num==2 || $num==3 } { puts -nonewline "$num " continue } ``` 我們跳過 2 和 3 的計算。它們是質數,不需要進一步的計算。 請注意等式和條件或運算符的用法。 `==`的優先級高于`||`運算符。 因此,我們不需要使用括號。 ```tcl set i [expr int(sqrt($num))] ``` 如果我們僅嘗試小于所討論數字的平方根的數字,那么我們可以。 ```tcl while { $i > 1 } { if { $num % $i == 0 } { set isPrime false } incr i -1 } ``` 在此`while`循環中,`i`是計算出的數字的平方根。 我們使用`incr`命令將每個循環周期將`i`減少 1。 當`i`小于 1 時,循環結束。 例如,我們有 9。9 的平方根是 3。我們將 9 的數字除以 3 和 2。這對于我們的計算就足夠了。 ```tcl if { $isPrime } { puts -nonewline "$num " } ``` 如果余數除法運算符針對任何 i 值返回 0,則說明該數字不是質數。 ```tcl $ ./primes.tcl Prime numbers: 2 3 5 7 11 13 17 19 23 29 31 ``` 這是`primes.tcl`腳本的輸出。 在 Tcl 教程的這一部分中,我們介紹了 Tcl 表達式。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看