?? pl004.asp
字號:
<ADDRESS><FONT COLOR="#000080">' 回 圈 內(nèi) 的 程 式 段 </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">i = i + 1 </FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">Wend </FONT></ADDRESS>
</UL>
<P>這 個(gè) 回 圈 一 共 執(zhí) 行 9 次 , 然 後 在 i = 10 的 時(shí) 候 跳 出 , 看
起 來 并 沒 有 什 麼 問 題 , 但 萬 一 我 們 在 「 回 圈 內(nèi) 的 程 式 段
」 也 會 改 變 i 的 值 , 那 麼 i 就 可 能 會 跳 過 10, 而 使 得 回 圈
無 法 結(jié) 束 , 所 以 不 妨 把 「 i <> 10」 改 成 比 較 寬 松 的 條
件 「 i < 10」 , 以 降 低 進(jìn) 入 無 窮 回 圈 的 機(jī) 會 。 </P>
<P>前 面 的 例 子 是 以 「 計(jì) 數(shù) 器 」 的 值 來 判 別 跳 出 回 圈 的 條
件 , 只 要 稍 加 小 心 , 出 錯(cuò) 的 機(jī) 會 其 實(shí) 不 大 , 另 一 種 情 形
是 以 「 輸 入 的 資 料 」 來 判 別 跳 出 回 圈 的 條 件 , 舉 例 來 說
, 以 下 的 C 程 式 在 計(jì) 算 字 串 的 長 度 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">strlen( char *str ) </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">{ </FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">int n; </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">for ( n = 0; *str != '\0'; str++) </FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">n++; </FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">return(n); </FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">} </FONT></ADDRESS>
</UL>
<P>這 段 程 式 判 別 *str != '\0' 時(shí) 跳 出 for 回 圈 , 這 是 假 設(shè) 輸
入 的 資 料 (str )一 定 包 含 '\0', 但 萬 一 str 不 含 '\0'( 也 許 是
呼 叫 端 的 錯(cuò) 誤 ) , 就 可 能 造 成 無 法 跳 出 回 圈 的 現(xiàn) 象 , 所
以 這 個(gè) 副 程 式 改 成 以 下 的 樣 子 比 較 好 : ( 在 回 圈 中 多 加
了 「 n <= max」 的 判 斷 條 件 , 保 證 讓 回 圈 可 以 結(jié) 束 ) </P>
<UL>
<ADDRESS><FONT COLOR="#000080">strnlen( char *str, int max ) </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">{ </FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">int n; </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">for ( n = 0; *str != '\0' && n <=
max; str++) </FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">n++; </FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">return(n); </FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">} </FONT></ADDRESS>
</UL>
<P>無 窮 回 圈 在 C 語 言 中 還 可 能 產(chǎn) 生 一 些 幻 象 , 下 面 的 程
式 以 顛 倒 順 序 取 出 字 串 的 字 元 ( 從 位 置 20 到 0) , 但 撰 寫
時(shí) 不 小 心 把 i-- 打 成 了 i++, 結(jié) 果 程 式 變 成 了 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">for ( i = 20; i >= 0; i++ ) </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">{</FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">ch = buf[i]; </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">...</FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">} </FONT></ADDRESS>
</UL>
<P>表 面 上 這 段 程 式 會 造 成 無 窮 回 圈 , 但 其 實(shí) 不 然 , 因 為
i 加 到 極 限 時(shí) 會 繞 回 到 負(fù) 值 ( 如 果 是 BASIC 程 式 則 會 產(chǎn) 生
「 溢 位 」 的 錯(cuò) 誤 ) , 還 是 跳 出 了 回 圈 , 這 樣 的 錯(cuò) 誤 在 執(zhí)
行 時(shí) 并 不 會 馬 上 被 偵 測 到 , 頂 多 只 是 覺 得 程 式 有 點(diǎn) 慢 ,
而 被 忽 略 了 。 </P>
</UL>
<P><B><U><FONT COLOR="#000080"><FONT SIZE=+1>邏 輯 判 斷 式 </FONT></FONT></U></B></P>
<UL>
<P>犯 錯(cuò) 乃 人 之 常 情 , 在 棋 類 的 比 賽 中 , 獲 勝 者 往 往 是 想
的 步 數(shù) 多 而 又 犯 錯(cuò) 少 者 , 在 程 式 設(shè) 計(jì) 中 , 沒 有 競 爭 對 手
, 邏 輯 判 斷 式 不 必 寫 得 復(fù) 雜 到 別 人 看 不 懂 , 反 倒 應(yīng) 該 以
簡 單 明 瞭 為 原 則 , 舉 例 來 說 , 數(shù) 學(xué) 式 1 ≤ x ≤ 5 在 程 式 語
言 中 至 少 有 以 下 兩 種 表 達(dá) 方 式 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">(1) x >= 1 And x <= 5 </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">(2) 1 <= x And x <= 5 </FONT></ADDRESS>
</UL>
<P>其 中 以 第 (2) 種 表 達(dá) 方 式 與 大 家 習(xí) 慣 的 數(shù) 學(xué) 式 比 較 像
, 自 然 比 較 好 。 </P>
<P>在 邏 輯 學(xué) 中 , 曾 教 過 我 們 一 些 簡 化 邏 輯 的 公 式 , 但 是
在 程 式 設(shè) 計(jì) 中 , 被 簡 化 的 式 子 未 必 比 較 容 易 理 解 , 舉 例
來 說 , 判 斷 某 一 個(gè) 變 數(shù) 不 在 1 與 5 之 間 , 其 推 演 過 程 是 :
</P>
<UL>
<ADDRESS><FONT COLOR="#000080">變 數(shù) x 在 1 與 5 之 間 </FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">=> 1 <= x And x <= 5</FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">變 數(shù) x 不 在 1 與 5 之 間 </FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">=> Not (1 <= x And x <= 5 )</FONT></ADDRESS>
</UL>
</UL>
<P>所 以 以 Not (1 <= x And x <= 5 ) 來 表 達(dá) 變 數(shù) 不 在 1 與 5
之 間 是 很 自 然 , 而 且 容 易 理 解 的 。 不 過 有 人 認(rèn) 為 這 樣 子
多 了 一 個(gè) Not 的 判 斷 , 執(zhí) 行 效 率 較 差 ( 他 小 看 了 編 譯 器 的
「 最 佳 化 」 能 力 ) , 所 以 想 把 這 個(gè) 判 斷 式 加 以 簡 化 , 根
據(jù) De Morgan 定 理 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">Not (x And y) = (Not x) Or (Not y) </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">Not (x Or y) = (Not x) And (Not y) </FONT></ADDRESS>
</UL>
<P>Not (1 <= x And x <= 5 ) 應(yīng) 該 轉(zhuǎn) 換 成 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">1 > x Or x > 5 </FONT></ADDRESS>
</UL>
<P>但 說 實(shí) 在 , 乍 看 之 下 , 這 個(gè) 被 簡 化 的 式 子 并 不 容 易 馬
上 意 會 到 它 想 表 達(dá) 的 是 x 介 於 1 及 5 之 間 。 而 筆 者 還 見 過
粗 心 的 程 式 設(shè) 計(jì) 師 把 它 轉(zhuǎn) 成 「 1 > x And x > 5 」 ( 忘 了
對 And 作 Not 的 動 作 ) 。 </P>
<P>企 圖 簡 化 邏 輯 判 斷 式 應(yīng) 該 小 心 , 而 對 於 過 於 冗 長 的 判
斷 式 則 應(yīng) 該 讓 它 更 容 易 閱 讀 一 點(diǎn) , 以 下 是 一 個(gè) C 語 言 的
判 斷 式 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">// || 表 示 Or, && 表 示 And</FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">if ( e1 || e2 &&</FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080"> e3 || e4 &&</FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080"> e5 ) {</FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">...</FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">}</FONT></ADDRESS>
</UL>
<P>乍 看 之 下 , 這 個(gè) 判 斷 式 想 表 達(dá) (e1 Or e2) And (e3 Or e4) And
e5, 但 依 程 式 語 言 的 慣 例 來 看 , And 會 優(yōu) 於 Or 先 被 處 理 ,
因 此 上 面 的 判 斷 式 應(yīng) 該 等 於 e1 Or (e2 And e3) Or (e4 And e5),
所 以 不 妨 加 上 幾 個(gè) () 使 判 斷 式 更 容 易 閱 讀 一 點(diǎn) , 所 以 筆
者 建 議 把 以 上 的 C 語 言 判 斷 式 改 成 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">if ( e1 || </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080"> (e2 && e3) || </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080"> (e4 && e5) ) { </FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">... </FONT></ADDRESS>
</UL>
<ADDRESS><FONT COLOR="#000080">} </FONT></ADDRESS>
</UL>
<P>可 避 免 將 來 閱 讀 程 式 時(shí) 產(chǎn) 生 誤 解 。 </P>
<P>如 果 您 寫 C 程 式 , 以 下 是 一 個(gè) 在 C 程 式 中 極 為 普 遍 的
錯(cuò) 誤 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">// 判 斷 x 是 否 等 於 1 </FONT></ADDRESS>
<ADDRESS><FONT COLOR="#000080">if ( x = 1 ) </FONT></ADDRESS>
<UL>
<ADDRESS><FONT COLOR="#000080">... </FONT></ADDRESS>
</UL>
</UL>
<P>結(jié) 果 不 管 x 的 值 等 於 什 麼 , 這 個(gè) 判 斷 式 永 遠(yuǎn) 都 成 立 ,
仔 細(xì) 檢 查 , 原 來 把 用 來 「 比 較 相 等 」 的 == 打 成 了 「 指 定
數(shù) 值 」 的 =, 所 以 經(jīng) 過 「 x = 1」 之 後 , x 就 變 成 了 1, 而 被
判 斷 成 TRUE。 </P>
<P>這 種 錯(cuò) 誤 起 於 一 時(shí) 打 錯(cuò) , 而 它 在 C 語 言 中 又 屬 合 法 的
式 子 , 可 以 通 過 編 譯 器 的 檢 查 , 這 樣 的 錯(cuò) 誤 往 往 不 是 肉
眼 可 以 馬 上 看 得 出 來 的 , 容 易 造 成 偵 錯(cuò) 的 死 角 , 對 於 上
述 的 錯(cuò) 誤 , 筆 者 建 議 將 「 常 數(shù) 」 放 在 「 比 較 等 於 的 ==」
的 左 邊 , 例 如 : </P>
<UL>
<ADDRESS><FONT COLOR="#000080">if ( 1 == x ) </FONT></ADDRESS>
</UL>
<P>因 為 這 與 if ( x == 1 ) 的 意 思 完 全 相 同 , 而 萬 一 我 們 不
小 心 將 == 打 成 = 時(shí) , if ( 1 = x ) 并 不 會 通 過 編 譯 器 的 檢 查
, 可 提 前 在 編 譯 階 段 檢 查 出 這 樣 的 錯(cuò) 誤 。 </P>
</UL>
<H2><A NAME="s3"></A><FONT COLOR="#0000FF">變 數(shù) </FONT></H2>
<P><B><U><FONT COLOR="#000080"><FONT SIZE=+1>打 錯(cuò) 了 變 數(shù) 名 稱 </FONT></FONT></U></B></P>
<UL>
<P>只 要 是 人 , 一 定 會 打 錯(cuò) 字 , 在 程 式 撰 寫 時(shí) , 您 可 能 少
打 一 個(gè) 右 括 弧 , 或 是 多 打 一 個(gè) 分 號 , 也 可 能 把 函 數(shù) 或 變
數(shù) 的 名 稱 打 錯(cuò) 了 , 這 些 錯(cuò) 誤 絕 大 部 份 無 法 通 過 編 譯 器 的
法 眼 , 但 仍 有 少 數(shù) 錯(cuò) 誤 可 以 過 關(guān) , 這 些 漏 網(wǎng) 之 魚 基 本 上
還 是 符 合 程 式 的 語 法 , 只 是 與 程 式 設(shè) 計(jì) 師 的 意 思 相 違 背
, 也 許 正 因 為 如 此 , 這 類 型 的 錯(cuò) 誤 也 容 易 被 忽 略 , 形 成
偵 錯(cuò) 上 的 死 角 。 </P>
<P><FONT COLOR="#800000">錯(cuò) 誤 實(shí) 例 之 一 :</FONT> 以 下 是 一 個(gè) BASIC
的 程 式 段 , 在 計(jì) 算 利 率 加 本 金 。 </P>
<UL>
<P>Interest = Total * 0.08 ' 計(jì) 算 「 利 率 」 </P>
<P>Total = Total + Intrest ' 本 金 + 利 率, Int<FONT COLOR="#FF0000">e</FONT>rest,
漏了 e</P>
</UL>
<P><FONT COLOR="#800000">錯(cuò) 誤 說 明 : </FONT></P>
<P>由 於 BASIC 允 許 在 「 不 預(yù) 先 宣 告 變 數(shù) 」 下 直 接 使 用 變 數(shù)
, 使 得 例 子 中 的 Intrest 被 當(dāng) 成 另 一 個(gè) 新 的 變 數(shù) , 而 不 會
在 編 譯 階 段 被 偵 測 出 來 。 如 果 換 成 C 、 PASCAL 等 「 變 數(shù) 必
須 事 先 宣 告 」 的 語 言 , 編 譯 器 會 馬 上 告 訴 您 「 Intrest 未
宣 告 」 , 使 這 種 錯(cuò) 誤 不 至 於 溜 到 執(zhí) 行 階 段 , 浪 費(fèi) 偵 錯(cuò) 的
時(shí) 間 。 </P>
<P><FONT COLOR="#800000">錯(cuò) 誤 避 免 : </FONT></P>
<P>「 不 預(yù) 先 宣 告 變 數(shù) 」 就 可 以 直 接 使 用 變 數(shù) 雖 然 方 便 ,
卻 可 能 發(fā) 生 打 錯(cuò) 字 而 不 自 覺 的 現(xiàn) 象 , 在 兩 權(quán) 相 害 取 其 輕
之 下 , 最 好 關(guān) 掉 這 個(gè) 方 便 之 門 。 在 BASIC 系 列 的 開 發(fā) 工 具
中
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -