自增、自减运算
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如:
基本思想如下 :
int a = 3 ;
1) 设两个工作栈 。一个称做 OPTR 栈 ,用以寄存运算符 ;
int b = + + a ; / / a 增 1 后赋给 b ;
另一个称做 OPND 栈 ,用以寄存操作数或运算结果 。
cout < < a < < ’\ t’< < b < < endl ;
2004 年第 8 期 福 建 电 脑
81
自增 、自减运算
赵素萍
(洛阳师范学院计算机科学系 ,河南 洛阳 471002 )
【摘 要】 在 C + + 中 ,经常使用自增 、自减运算符 , 本文给出它们在表达式中出现时的求值方法 。 【关键词】 自增 自减 左结合 右结合 表达式 优先级 求值顺序 栈
而 + + m 3 + + m + + + m 的操作过程是 :
式求值顺序为从左到右 ,前置自增为先修改操作数使之增 1 ,增
步骤 OPTR OPND 输入字符
1 后的值作为表达式的值 。第一次做加法时 ,取的两个操作数
1
+ +m
为 m 增 1 再增 1 的值 ,即 5 ,故和为 10 ;当做第二个加法时 ,第
相应操作 (栈顶元素优先权低 ,运算符进栈 ; 否则 ,栈顶元素出
4 4
栈 ,同时从操作数栈出栈两个元素进行运算 ,并将运算结果入
5 4
栈 。) ,直至整个表达式求值完毕 。注 :第一个运算符直接进栈 。
在书写 + + 和 - - 时 ,中间不能有空格 ,比如 : + + a 和 +
2) 首先置两栈为空栈 。
int c = a + + ; / / a 值赋给 c ,a 再增 1 ;
3) 依次读入表达式中的每个字符 ,若是操作数则进 OPND
cout < < a < < ’\ t’< < c < < endl ;
栈 ,若是运算符 ,则和 OPTR 栈的栈顶运算符比较优先权后作
运行结果为 :
80 (15 3 5 + 5) 当自增 、自减运算符出现在表达式中时 ,若是后置 ,用原值
计算 ,表达式计算结束 ,变量值再修改 ; 若是前置 ,用修改后的 值计算 ,另外要注意优先级和表达式求值顺序 。再如 :
三 、自增 、自减运算用于 cout 系统在运行 cout 的一系列“ < < ”操作时 ,先将各表达式的 值从右到左依次存储到缓冲区 ,当刷新缓冲区时 ,则按从左到 右的顺序输出 ,因为插入运算符的结合性为右结合 。例如 :
说明 :步骤 4 输入运算符 3 ,比栈顶运算符 + 优先级高 ,入
在 Visual C + + 6. 0 下运行 ,它们的值分别为 10 (5 + 5) ,16 栈 ;步骤 6 表达式输入完毕 ,步骤 7 开始出栈 ,并做相应运算 。
(5 + 5 + 6) 和 23 (5 + 5 + 6 + 7) 。因为加法为双目运算符 ,表达
$recPerPage 是每次查询的记录数 (即每页显示的图书数) ,它 们是 limit 字句的两个参数 ,决定每次从哪条记录开始 ,最多查 出几条记录 ,即实现分页查询 。分页查询可以提高查询速度 , 减轻服务器的负担 ,显著提高网站运行效率 ,并使浏览器显示 页面简洁美观 ,便于用户浏览 。
五 、结束语
参考文献 [ 1 ] 沈世强 ,ASP/ ADO 查询分页显示技术 ,上海 :微型电脑应用 ,2002 [ 2 ] 网胜工作室编著 ,PHP4. 0 程序设计 ,北京 :北京希望电子出版社 ,2000 。 [ 3 ] 吕京涛 、陈宗斌 ,PHP4. 0 入门与提高 ,北京 :清华大学出版社 ,2002 [ 4 ] 高海茹 、李智 、陈清阳 ,MySQL 网络数据库技术精粹 ,北京 :机械工业出版社 ,2002
另外 ,在 VC 环境中 ,表达式求值顺序为从左到右 。
6
+ , 3 &m , &m , &m
请看下边几组运算 (假设 m = 3) :
7
+
&m
⑴ + + m + ( + + m)
8
+
&m ,36
+ + m + ( + + m) + ( + + m)
9
42
+ + m + ( + + m) + ( + + m) + ( + + m)
对数据 (变量或常量) 进行运算或处理是通过运算符进行
+ + m 3 + + m + + + m
的 。C + + 中的运算符比较多 ,其中自增 、自减运算符使用频率
它们的值依次为 25 ,42 (6 + 6 3 6) 和 31 (5 3 5 + 6) 。其中第
很高且不易掌握 , 本文就这两个运算符略做探讨 ( 以自增为 二个和第三个表达式仅仅交换了加法和乘法的位置 ,结果却不
参考资料 1. 刘斌 王忠编著. 面向对象程序设计 - Visual C + + . 清华大学出版社 ,2003 年 2 月. 2. 钱能主编. C + + 程序设计教程. 清华大学出版社 ,2002 年 5 月 3. 吕凤翥主编. C + + 语言程序设计. 北方交通大学出版社 清华大学出版社 ,2003 年 7 月
再如 :a = 0 ,m = 3 ,k = 15 ,请看下面几组表达式的值 :
a = m 3 k + ( + + m) A: a= + +m+m3 k 毫无疑问 ,第一个表达式值为 49 。那么 ,第二个表达式值
为多少呢 ? 按照上述方法 ,不难求出其值为 64 (注意 :不是 49)
a = m + + 3 k + ( + + m) B: a= + +m+m+ + 3 k 这两个表达式值分别为 49 和 64 ,同 A 组结果一样 。因为
它们的值依次为 6 ,9 和 12 ,即用 m 的原值做加法 (先将变
8
31
量 a 的值作为表达式的值确定下来) ,再将 a 修改 。
说明 :步骤 4 输入运算符 + ,比栈顶运算符 3 优先级低 ,故
⑶ + + m 3 + + m
步骤 5 做出栈操作 ,乘法运算 ,并将运算结果入栈 ,到步骤 7 表
+ + m + + + m 3 + + m
达式输入完毕 ,步骤 8 做加法运算 ,求出运算结果 。
82
福 建 电 脑 2004 年第 8 期
掌握了前置自增和后置自增的运算方法后 ,不难求出 m + + + ( + + m) + ( + + m) 的值为 13 (4 + 4 + 5) ,m + + + m + + + ( + + m) 值为 10 (3 + 3 + 4) 。
1 ,自减操作表示减 1 。自增有前置自增 ( + + a) 和后置自增 (a 但按求值顺序 ,先安排加法的第一个加数 + + m ,使 m 增 1 ,再
+ + ) 之分 。前置自增 ( + + a) 的意义为 :先修改操作数使之增 安排第二个加数 :乘法运算的结果 。做乘法时 ,又使 m 增 2 ,故
} 运行该程序 ,输出结果为 : 4 3 6 6 8 7 而非 3 4 5 6 8 8 当将输出改为 printf 函数时 ,输出结果为 : 3 3 6 6 8 7 四 、几点注意事项 1 、不同的编译器求值顺序不同 。如 :假设 m = 3 ,则 + + m + ( + + m) + ( + + m) ,在 BC 环境下运行值为 15 , 在 VC 环境下运行值为 16 。 2 、求值顺序使交换率失去作用 。如 :
的空格或括号 ,比如 :a + + + + + b。
如 + + m + + + m 3 + + m 的操作过程如下 ( &m 代表
二 、自增和自减用于表达式
m 地址 ,运算时用 m 的值) :
表达式是由运算符和操作数组成的 ,能够求出值的式子 。
步骤 OPTR OPND 输入字符
在求值时一定要注意运算符的优先级和结合性 。结合性规定
4) 对于前置自增 (或自减) ,入 OPND 栈的为变量地址 (这
+ a 是不同的 ,后者等价于 + ( + a) ,即为 a 。另外 ,a + + + b 等 样 ,出栈时即可得到修改后的 m 值) ;对于后置自增 (或自减) ,
价于 (a + + ) + b ,当有多个 + 或 - 相连时 ,就要考虑增加适当 入 OPND 栈的为变量值 。
位置 ,那么 C 组的值分别为多少呢 ? 答案是均为 64 ,你算对了
吗?
D:
a = + + m 3 k + ( + + m) a = + + m + ( + + m) 3 k
将此组表达式与前边的比较 ,所不同的是 :表达式中的 m
均为 + + m ,D 组的值分别为多少呢 ? 分别为 65 (4 3 15 + 5) 和
1 ,然后将增 1 过的 a 值作为表达式的值 。而后置自增 (a + + ) 参与运算的 m 值为 6 。而第三个表达式的第一个运算符即为乘
的意义为 :先将变量 a 的值作为表达式的值确定下来 ,再将 a 增 法 ,所以 ,参与乘法运算的 m 取值 5 。也许你还不太明白 ,下边 ,
1 。相应的 ,自减有前置自减 ( - - a) 和后置自减 ( - - a) 。例 我们借助栈来说明 。
本文介绍了用 PHP 对 Web 数据库 MySQL 进行查询和分 页显示的实现方法 ,并给出了主要程序代码 ,该程序通用性强 , 在 Windows98 + Apache2. 0. 45 + PHP4. 2. 3 + MySQL4. 0. 13 环 境下运行效果良好 ,是本人开发的模拟网上书店 (供学生学习 动态网页编程实验用) 中的一部分 。分页查询及显示是一般 Web 网站都用到的功能 ,在此给出程序代码 ,供网站开发者参 考。
a= + +m+ m+ + 3k
a=m+ + 3k+ + +m 3 、短路表达式 假设 m = 3 ,n = 9 ,k = 15 , 计算表达式 a = m > n & & + + k 值后 , k 的值并没有增 1 , 因为由 m > n 已经得到 a 值为 0 , + + k 不再计算 。 本文对自增 、自减运算过程做了一个简单讨论 ,希望对大 家能有所帮助 ,如有不当之处 ,欢迎批评 、指正 。
Байду номын сангаас
例) ,希望能对大家有所帮助 。
一样 ,也就是说 ,交换率不成立 ,为什么呢 ? 还要从优先级和表
一 、自增和自减运算符
达式求值顺序上考虑 。表达式求值顺序为从左到右 ,对于第二
自增和自减运算符表示为 : + + 和 - - 。自增操作表示加 个表达式 ,第二个运算符乘法优先级高于第一个运算符加法 ,
后置自增是 :先将变量 m 的值作为表达式的值确定下来 ,再将
m 增 1 ,即 :m + + 3 k 和 m 3 k 值相等 ,所不同的是运算结束 后 ,m 的值不等 。
a= + +m3k+m C : a = m + ( + + m) 3 k 将 C 组和 A 组对比 ,你会发现 ,仅仅是 m 和 + + m 交换了
1
+ +m
了优先级相同的运算符的计算顺序 。结合性分为两种 ,一种是
2
&m
+
右结合 ,即对操作数按从左到右的顺序进行运算 ; 另一种是左
3
+
&m
+ +m
结合 ,即对其操作数按从右到左的顺序进行运算 。大多数运算
4
+
&m , &m 3
符为右结合 ,但自增 、自减 、赋值及复合赋值运算符为左结合 。
5
+ , 3 &m , &m + + m
# include < iostream. h >
void main ()
{int a = 3 ,b = 5 ,c = 7 ; cout < < a < < ’\ t’< < a + + < < endl ; cout < < b < < ’\ t’< < + + b < < endl ; cout < < + + c < < ’\ t’< < c < < endl ;
2
&m
3
一个操作数为 10 ,第二个操作数 m 又增 1 ,故为 10 + 6 ,值为
3
3
&m
+ +m
16 ,依次类推 。
4
3
&m , &m +
⑵ m + + + m + +
5
25
m + + + m + + + m + +
6
+
25
+ +m
m + + + m + + + m + +
7
+
25 , &m
(上接第 84 页)
图2 程序 中 分 页 查 询 的 关 键 SQL 语 句 是“select 3 from $DB Table where catid = \ ”$catid \ “ order by bookid limit $init-pos , $recPerPage”。其中 $init-pos 是查询的起点 ,