我们讨论一下C语言的两个术语,副作用和序列点。
先看以下代码
i = 10
它的作用是把i的值改为10,但这是副作用。虽然这看起来更像是主要目的,但从C语言的角度看,主要目的是对表达式求值,比如12+8,C会求值得10,。给出表达式i=10,C会求得值10,对表达式求值得副作用就是把变量I的值改为10,。跟赋值运算符一样,递增和递减运算符也有副作用,使用它们的主要目的就是使用其副作用。
类似的,使用Printf()函数时,也是使用它的副作用(printf的返回值是输出字符的个数)
int num = printf(“一句话”);
接下来再讲序列点,我们知道,在C语言中,一个语句以分号结束。同时也标记了一个序列点,在该点上,所有副作用都要在进入下一步之前完成.,意思是,在一个语句中,赋值运算符、递增和递减运算符对运算对象做的改变必须在程序执行下一条语句之前完成。任何一个完整表达式的结束也是一个序列点。
完整表达式是什么?完整表达式是指这个表达式不是更大表达式的一部分,比如这个for循环
while(i++<10)
printf(“%d\n” , i );
很多人认为的·“先使用值,再递增它”的意思是,在printf()函数中先使用i变量再递增它。但i++<10是一个完整的表达式,因为它是while循环的测试条件,所以该表达式的结束就是一个序列点。C因此保证了程序执行到printf()之前发生副作用(即递增i),同时使用了后缀形式保证了guets在完成与10的比较的时候才进行递增。
本次小课堂就到这里,谢谢阅读。