关于序列点以及副作用的问题。

Coz_CS 2017-11-20 10:45:49
一段不完整代码如下:
int age=20;
while(age++<=65) // 第二行
{
if((age%20)==0) // 第四行
printf("You are %d.",age);
}


这段代码运行后是不会输出age=20的这一情况的,不太清楚为什么。想问一下在while循环测试条件中的自增运算符++对age影响的整个过程是怎样的。
<=这类关系运算符之后用到的与65比较的数值是递增后的age还是未递增的?副作用是发生在<=之前还是在整个age++<=65测试条件求值之后呢?C语言中有哪些常见序列点?副作用只在序列点之后发生吗?
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2017-11-21
  • 打赏
  • 举报
回复
另参看:关于C,C++表达式求值顺序 http://bbs.csdn.net/topics/370153775
paschen 2017-11-21
  • 打赏
  • 举报
回复
后置的++表示:先与65比较,比较完age自加1,比较完之后,age变为了21,此时不满足后面的if,故不进行输出,又进行下一次循环....
赵4老师 2017-11-21
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
destory27 2017-11-21
  • 打赏
  • 举报
回复
%20 值在0 - 19
自信男孩 2017-11-21
  • 打赏
  • 举报
回复
因为while循环比较条件时,age++是一个整体,因为其优先级高,所以先跟age结合,这样age++与65比较,即20 <= 65; 循环条件判断之后,然后age++,自然是21,所以循环体里的age是21
FoolCarpe 2017-11-20
  • 打赏
  • 举报
回复
age++<=65 等价于 age <= 65; age += 1; age % 20 中age已经为21了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧