表达式 副作用 序列点

语句分类

  • 标号语句(标签,常与goto配合使用)
  • 复合语句(块)
  • 表达式语句(赋值表达式语句、函数表达式语句等)
  • 选择语句
  • 迭代语句(循环)
  • 跳转语句(return,break,continue)

其中复合语句(块)可视为单个语句。因此while和for循环之后加的是单个语句(简单语句、复合语句、空语句(只有1个;构成的语句))

表达式

构成:运算符+运算对象(运算符操作的对象)。运算符是可选的,但运算对象必须要有。

最简单的表达式是不带运算符的变量或字面常量。

在赋值表达式语句中,格式为:可被修改的左值(特定的数据对象名称或表达式)(对象定位值)=右值(常量、变量、可求值的表达式)

副作用与序列点

主作用:表达式的值(函数的返回值等)

副作用:对数据对象或文件的修改

例:x=50;中,x被修改为50其实是此表达式的副作用。

再如printf(“Hello,world!”);中,printf函数表达式的主作用是该函数表达是的值(即函数表达式的返回值),向标准输出设备输出格式化输出字符串的内容其实是此函数表达式的副作用。

完整表达式:此表达式不是另一个更大的表达式的子表达式。

序列点:程序执行的点,所有表达式的副作用都必须在序列点之前完成。所有完整表达式的结束、;,、逻辑运算符都是一个序列点。

例:

int x=1;
while(x--){//先判断再递减(后缀自减)。由于序列点在判断式结尾,在进入循环体之前就减完了
    cout<<x<<endl;
}

运行结果:1

int x=1;
while(--x){//先递减再判断(前缀自减)。由于序列点在判断式结尾,在进入循环体之前就减完了
    cout<<x<<endl;
}

运行结果:(空)(未进入循环体)
上述例子的前缀自减和后缀自减的时机不同,进而影响循环条件的判断,导致循环次数也有不同(因此二者在最后一次循环上会有所差异),实际上在能进入循环体的情况下输出都是一样的(都是已经减完之后的结果)

posted @   椰萝Yerosius  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示