C语言中的副作用、序列点、完整表达式
C语言中有个术语叫:副作用
副作用其实是对数据对象或文件的修改。(数据对象的定义是:用于存储值的数据存储区域)
例如语句 states = 50;
从C语言的角度来讲:这个赋值表达式的副作用是将变量的值设置为50;目的是对表达式求值;
但是使用赋值表达式的主要目的(真正目的)就是使用其副作用(将变量的值设置为50);
除此之外,递增、递减运算符也有副作用;我们使用它们其实主要目的是使用其副作用。即递增、递减的副作用;
例如printf()函数,我们使用它的目的是使用其副作用,其副作用是显示信息。它从C语言角度来说,目的是返回待显示字符的个数。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
序列点:
是程序执行的点,所有的副作用都在进入下一步之前发生;
语句中的分号标记了序列点;
当然不一定要分号才表示序列点;
完整表达式的结束也是一个序列点。
例如:
while (guests++<10)
printf("%d \n",guests)
上面程序当中:guests++<10 就是一个完整的表达式,该表达式的结束也是一个序列点。
guests++<10的意思是guests先跟10比较(比较会得到布尔值True、False,这个过程是求值,也就是C语言角度来说的目的),再递增(把guests的值加1,即对数据对象或文件的修改,即副作用。这个副作用其实也是我们编写程序角度的主要目的。)。
guests简单概括就是先比较(求值)再递增。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
完整表达式:
这个表达式不是另一个表达式的子表达式;
表达式语句中的表达式,循环条件的测试条件表达式,都是完整表达式。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
补充一下表达式expression、语句statement的概念:
表达式:
表达式是由运算符和运算对象组成的。
运算对象是运算符操作的对象。
对简单的表达式是一个单独的运算对象。
表达式最重要的特性之一就是每个表达式都有一个值。
要获得这个值,必须根据运算优先级规定的顺序去操作。
语句:
语句是C语言的基本构建块。
一条语句相当于一条完整的计算机指令。
在C中,大部分语句都以分号结尾。
最简单的语句是空语句。
真正有效的语句是可以改变值或调用函数;
注意:语句和表达式不能划等号;
语句的分类:表达式语句、迭代语句、跳转语句、声明等。
声明创建了名称和类型,并为其分配内存空间和位置;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C语言中的副作用、序列点、完整表达式的更多相关文章
- c语言中的副作用!!千万小心!
今天刚看完书上的副作用,博主觉得呢,副作用其实就在改变变量的值,也就是一个赋值操作!不过刚刚在知道上还是犯了错!!尴尬啊!! 大家都知道,c语言中的赋值操作符是自右向左结合的!! 下面有一个关于赋值中 ...
- java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)
2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...
- C语言中的序列点
TAG: C, 序列点 DATE: 2013-08-07 序列点是程序执行序列中一些特殊的点. 当有序列点存在时,序列点前面的表达式必须求值完毕,并且副作用也已经发生, 才会计算序列点后面的表达式和其 ...
- C/C++ 语言中的表达式求值(原文作者:裘宗燕)
经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...
- C/C++ 语言中的表达式求值
在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...
- 在C语言中利用PCRE实现正则表达式
1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...
- 2.C语言中的关键字
1.auto 修饰局部变量,编译器默认所有局部变量都是用auto来修饰的,所以在程序中很少见到. 2.static 它作用可大了,除了可以修饰变量,还可以修饰函数,修饰变量,改变其作用域和生命周期,修 ...
- C语言中的宏定义
目录(?)[-] 简单宏定义 带参数的宏 运算符 运算符 宏的通用属性 宏定义中圆括号 创建较长的宏 较长的宏中的逗号运算符 宏定义中的do-while循环do 空操作的定义 预定义宏 C语言中常用的 ...
- C语言中变量的存储类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register 寄存器变量extern 外部变量static 静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...
随机推荐
- JS写一个简单的程序,判断年份是平年还是闰年
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- mysql工具Navicat批量执行SQL语句
例如:我现在要同时执行这么多语句 update community set xqmc=replace(xqmc,' ',''); update community set xqbm=replace(x ...
- spring中的class配置不能使用properties中的字符串
1.比如在a.properties中我们声明了一个变量: classRoom=com.wc82.ClassRoom 2.然后在spring的配置文件中:applicationContext.xml,有 ...
- solr-用mmseg4j配置同义词索引和检索(IKanlyzer需要修改源码适应solr接口才能使用同义词功能)
概念说明:同义词大体的意思是指,当用户输入一个词时,solr会把相关有相同意思的近义词的或同义词的term的语段内容从索引中取出,展示给用户,提高交互的友好性(当然这些同义词的定义是要在配置文件中事先 ...
- 【总结整理】AMAP学习AMAP.PlaceSearch()
http://lbs.amap.com/api/javascript-api/reference/search#m_AMap.PlaceSearch http://lbs.amap.com/api/j ...
- mt_rand()函数、str_shuffle() 函数、join() 函数
mt_rand() 使用 Mersenne Twister 算法返回随机整数. 语法 mt_rand(min,max) 定义和用法 str_shuffle() 函数随机地打乱字符串中的所有字符. 语法 ...
- Etyma01 ced ceed cess
一. etyma ['ɛtə,mə] ced.ceed.cess -> go -> 行走,前进 二.for instance 1. precede=pre+ced+e pre- 在前 2. ...
- JavaScript-ES6中的class及继承
我们知道,ES6中,引入了class这个关键字,让在JavaScript中定义类更加简单了 在介绍ES6中的class之前,我们先来看一下JavaScript之前类的实现,在此之前,JavaScrip ...
- visual2013 的 MVC 4中连接数据库报错解决方案
win7 64位安装vs2013后连接远程数据库出现下面的问题:A first chance exception of type 'System.AccessViolationException' ...
- AppDelegate生命周期回调顺序
1. 应用初次启动: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDiction ...