⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pl004.asp

📁 ASPWeb数据库范例总览
💻 ASP
📖 第 1 页 / 共 3 页
字号:
<ADDRESS><FONT COLOR="#000080">' 回 圈 内 的 程 式 段 </FONT></ADDRESS>

<ADDRESS><FONT COLOR="#000080">i = i + 1 </FONT></ADDRESS>
</UL>

<ADDRESS><FONT COLOR="#000080">Wend </FONT></ADDRESS>
</UL>

<P>这 个 回 圈 一 共 执 行 9 次 , 然 後 在 i = 10 的 时 候 跳 出 , 看
起 来 并 没 有 什 麼 问 题 , 但 万 一 我 们 在 「 回 圈 内 的 程 式 段
」 也 會 改 变 i 的 值 , 那 麼 i 就 可 能 會 跳 过 10, 而 使 得 回 圈
无 法 结 束 , 所 以 不 妨 把 「 i &lt;&gt; 10」 改 成 比 较 宽 松 的 条
件 「 i &lt; 10」 , 以 降 低 进 入 无 穷 回 圈 的 机 會 。 </P>

<P>前 面 的 例 子 是 以 「 计 数 器 」 的 值 来 判 别 跳 出 回 圈 的 条
件 , 只 要 稍 加 小 心 , 出 错 的 机 會 其 实 不 大 , 另 一 种 情 形
是 以 「 输 入 的 资 料 」 来 判 别 跳 出 回 圈 的 条 件 , 举 例 来 说
, 以 下 的 C 程 式 在 计 算 字 串 的 长 度 : </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' 时 跳 出 for 回 圈 , 这 是 假 设 输
入 的 资 料 (str )一 定 包 含 '\0', 但 万 一 str 不 含 '\0'( 也 许 是
呼 叫 端 的 错 误 ) , 就 可 能 造 成 无 法 跳 出 回 圈 的 现 象 , 所
以 这 个 副 程 式 改 成 以 下 的 样 子 比 较 好 : ( 在 回 圈 中 多 加
了 「 n &lt;= max」 的 判 断 条 件 , 保 证 让 回 圈 可 以 结 束 ) </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' &amp;&amp; n &lt;=
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 语 言 中 还 可 能 产 生 一 些 幻 象 , 下 面 的 程
式 以 颠 倒 顺 序 取 出 字 串 的 字 元 ( 从 位 置 20 到 0) , 但 撰 写
时 不 小 心 把 i-- 打 成 了 i++, 结 果 程 式 变 成 了 : </P>

<UL>
<ADDRESS><FONT COLOR="#000080">for ( i = 20; i &gt;= 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>表 面 上 这 段 程 式 會 造 成 无 穷 回 圈 , 但 其 实 不 然 , 因 为
i 加 到 极 限 时 會 绕 回 到 负 值 ( 如 果 是 BASIC 程 式 则 會 产 生
「 溢 位 」 的 错 误 ) , 还 是 跳 出 了 回 圈 , 这 样 的 错 误 在 执
行 时 并 不 會 马 上 被 侦 测 到 , 顶 多 只 是 觉 得 程 式 有 点 慢 ,
而 被 忽 略 了 。 </P>
</UL>

<P><B><U><FONT COLOR="#000080"><FONT SIZE=+1>逻 辑 判 断 式 </FONT></FONT></U></B></P>

<UL>
<P>犯 错 乃 人 之 常 情 , 在 棋 类 的 比 赛 中 , 获 胜 者 往 往 是 想
的 步 数 多 而 又 犯 错 少 者 , 在 程 式 设 计 中 , 没 有 竞 争 对 手
, 逻 辑 判 断 式 不 必 写 得 复 杂 到 别 人 看 不 懂 , 反 倒 应 该 以
简 单 明 瞭 为 原 则 , 举 例 来 说 , 数 学 式 1 ≤ x ≤ 5 在 程 式 语
言 中 至 少 有 以 下 两 种 表 达 方 式 : </P>

<UL>
<ADDRESS><FONT COLOR="#000080">(1) x &gt;= 1 And x &lt;= 5 </FONT></ADDRESS>

<ADDRESS><FONT COLOR="#000080">(2) 1 &lt;= x And x &lt;= 5 </FONT></ADDRESS>
</UL>

<P>其 中 以 第 (2) 种 表 达 方 式 与 大 家 习 惯 的 数 学 式 比 较 像
, 自 然 比 较 好 。 </P>

<P>在 逻 辑 学 中 , 曾 教 过 我 们 一 些 简 化 逻 辑 的 公 式 , 但 是
在 程 式 设 计 中 , 被 简 化 的 式 子 未 必 比 较 容 易 理 解 , 举 例
来 说 , 判 断 某 一 个 变 数 不 在 1 与 5 之 间 , 其 推 演 过 程 是 :
</P>

<UL>
<ADDRESS><FONT COLOR="#000080">变 数 x 在 1 与 5 之 间 </FONT></ADDRESS>

<UL>
<ADDRESS><FONT COLOR="#000080">=&gt; 1 &lt;= x And x &lt;= 5</FONT></ADDRESS>
</UL>

<ADDRESS><FONT COLOR="#000080">变 数 x 不 在 1 与 5 之 间 </FONT></ADDRESS>

<UL>
<ADDRESS><FONT COLOR="#000080">=&gt; Not (1 &lt;= x And x &lt;= 5 )</FONT></ADDRESS>
</UL>
</UL>

<P>所 以 以 Not (1 &lt;= x And x &lt;= 5 ) 来 表 达 变 数 不 在 1 与 5
之 间 是 很 自 然 , 而 且 容 易 理 解 的 。 不 过 有 人 认 为 这 样 子
多 了 一 个 Not 的 判 断 , 执 行 效 率 较 差 ( 他 小 看 了 编 译 器 的
「 最 佳 化 」 能 力 ) , 所 以 想 把 这 个 判 断 式 加 以 简 化 , 根
據 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 &lt;= x And x &lt;= 5 ) 应 该 转 换 成 : </P>

<UL>
<ADDRESS><FONT COLOR="#000080">1 &gt; x Or x &gt; 5 </FONT></ADDRESS>
</UL>

<P>但 说 实 在 , 乍 看 之 下 , 这 个 被 简 化 的 式 子 并 不 容 易 马
上 意 會 到 它 想 表 达 的 是 x 介 於 1 及 5 之 间 。 而 笔 者 还 见 过
粗 心 的 程 式 设 计 师 把 它 转 成 「 1 &gt; x And x &gt; 5 」 ( 忘 了
对 And 作 Not 的 动 作 ) 。 </P>

<P>企 图 简 化 逻 辑 判 断 式 应 该 小 心 , 而 对 於 过 於 冗 长 的 判
断 式 则 应 该 让 它 更 容 易 阅 读 一 点 , 以 下 是 一 个 C 语 言 的
判 断 式 : </P>

<UL>
<ADDRESS><FONT COLOR="#000080">//  || 表 示 Or, &amp;&amp; 表 示 And</FONT></ADDRESS>

<ADDRESS><FONT COLOR="#000080">if ( e1 || e2 &amp;&amp;</FONT></ADDRESS>

<ADDRESS><FONT COLOR="#000080"> e3 || e4 &amp;&amp;</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>乍 看 之 下 , 这 个 判 断 式 想 表 达 (e1 Or e2) And (e3 Or e4) And
e5, 但 依 程 式 语 言 的 惯 例 来 看 , And 會 优 於 Or 先 被 处 理 ,
因 此 上 面 的 判 断 式 应 该 等 於 e1 Or (e2 And e3) Or (e4 And e5),
所 以 不 妨 加 上 几 个 () 使 判 断 式 更 容 易 阅 读 一 点 , 所 以 笔
者 建 议 把 以 上 的 C 语 言 判 断 式 改 成 : </P>

<UL>
<ADDRESS><FONT COLOR="#000080">if ( e1 || </FONT></ADDRESS>

<ADDRESS><FONT COLOR="#000080"> (e2 &amp;&amp; e3) || </FONT></ADDRESS>

<ADDRESS><FONT COLOR="#000080"> (e4 &amp;&amp; e5) ) { </FONT></ADDRESS>

<UL>
<ADDRESS><FONT COLOR="#000080">... </FONT></ADDRESS>
</UL>

<ADDRESS><FONT COLOR="#000080">} </FONT></ADDRESS>
</UL>

<P>可 避 免 将 来 阅 读 程 式 时 产 生 误 解 。 </P>

<P>如 果 您 写 C 程 式 , 以 下 是 一 个 在 C 程 式 中 极 为 普 遍 的
错 误 : </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>结 果 不 管 x 的 值 等 於 什 麼 , 这 个 判 断 式 永 远 都 成 立 ,
仔 细 检 查 , 原 来 把 用 来 「 比 较 相 等 」 的 == 打 成 了 「 指 定
数 值 」 的 =, 所 以 经 过 「 x = 1」 之 後 , x 就 变 成 了 1, 而 被
判 断 成 TRUE。 </P>

<P>这 种 错 误 起 於 一 时 打 错 , 而 它 在 C 语 言 中 又 属 合 法 的
式 子 , 可 以 通 过 编 译 器 的 检 查 , 这 样 的 错 误 往 往 不 是 肉
眼 可 以 马 上 看 得 出 来 的 , 容 易 造 成 侦 错 的 死 角 , 对 於 上
述 的 错 误 , 笔 者 建 议 将 「 常 数 」 放 在 「 比 较 等 於 的 ==」
的 左 边 , 例 如 : </P>

<UL>
<ADDRESS><FONT COLOR="#000080">if ( 1 == x ) </FONT></ADDRESS>
</UL>

<P>因 为 这 与 if ( x == 1 ) 的 意 思 完 全 相 同 , 而 万 一 我 们 不
小 心 将 == 打 成 = 时 , if ( 1 = x ) 并 不 會 通 过 编 译 器 的 检 查
, 可 提 前 在 编 译 阶 段 检 查 出 这 样 的 错 误 。 </P>
</UL>

<H2><A NAME="s3"></A><FONT COLOR="#0000FF">变 数 </FONT></H2>

<P><B><U><FONT COLOR="#000080"><FONT SIZE=+1>打 错 了 变 数 名 称 </FONT></FONT></U></B></P>

<UL>
<P>只 要 是 人 , 一 定 會 打 错 字 , 在 程 式 撰 写 时 , 您 可 能 少
打 一 个 右 括 弧 , 或 是 多 打 一 个 分 号 , 也 可 能 把 函 数 或 变
数 的 名 称 打 错 了 , 这 些 错 误 绝 大 部 份 无 法 通 过 编 译 器 的
法 眼 , 但 仍 有 少 数 错 误 可 以 过 关 , 这 些 漏 网 之 鱼 基 本 上
还 是 符 合 程 式 的 语 法 , 只 是 与 程 式 设 计 师 的 意 思 相 违 背
, 也 许 正 因 为 如 此 , 这 类 型 的 错 误 也 容 易 被 忽 略 , 形 成
侦 错 上 的 死 角 。 </P>

<P><FONT COLOR="#800000">错 误 实 例 之 一 :</FONT> 以 下 是 一 个 BASIC
的 程 式 段 , 在 计 算 利 率 加 本 金 。 </P>

<UL>
<P>Interest = Total * 0.08   ' 计 算 「 利 率 」 </P>

<P>Total = Total + Intrest   ' 本 金 + 利 率, Int<FONT COLOR="#FF0000">e</FONT>rest,
漏了 e</P>
</UL>

<P><FONT COLOR="#800000">错 误 说 明 : </FONT></P>

<P>由 於 BASIC 允 许 在 「 不 预 先 宣 告 变 数 」 下 直 接 使 用 变 数
, 使 得 例 子 中 的 Intrest 被 当 成 另 一 个 新 的 变 数 , 而 不 會
在 编 译 阶 段 被 侦 测 出 来 。 如 果 换 成 C 、 PASCAL 等 「 变 数 必
须 事 先 宣 告 」 的 语 言 , 编 译 器 會 马 上 告 诉 您 「 Intrest 未
宣 告 」 , 使 这 种 错 误 不 至 於 溜 到 执 行 阶 段 , 浪 费 侦 错 的
时 间 。 </P>

<P><FONT COLOR="#800000">错 误 避 免 : </FONT></P>

<P>「 不 预 先 宣 告 变 数 」 就 可 以 直 接 使 用 变 数 虽 然 方 便 ,
却 可 能 发 生 打 错 字 而 不 自 觉 的 现 象 , 在 两 权 相 害 取 其 轻
之 下 , 最 好 关 掉 这 个 方 便 之 门 。 在 BASIC 系 列 的 开 发 工 具

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -