四则运算
这个就不耽误大家时间了,就是正常生活中的运算就行了,优先级什么的都是正常,不用担心编译器的问题,你只管开车办法老爹来想。(雾)
其他运算符
sizeof
sizeof返回值为一个叫size_t的变量,但是我们可以通过查找发现,这种变量是用typedef声明转化为unsigned int 或者unsigned long型。
typedef:给一个类型起别名的机制
typedef number int;
这样在你定义int型的时候,可以写成 number max;这样来定义一个int型
言归正传,看一下接下来的例子:
size_t intsize;
intsize = sizeof(int);
printf("%zd",intsize);
首先,sizeof运算符如果对一个变量使用,是可以没有括号的,但对于一个类型则一定要有括号;
另外,c99中增加了zd类型,在上一篇博客《scanf和printf函数》中有简介,是专门用来输出sizeof类型的返回值,当然不用也是可以的,u或者ul也能解决问题
求模运算 “%”
a%b,其中ab都是int型
如5%3=2,因为5中有一个3,剩下的2不足3,所以为余数。
这里面的重点在下面,在c99标准之后,对于int型运算有很大的冲击,以前的直接截断方式被取消了,换成了“趋零截断”,
也就是如 -19/5这样的结果,-3.8之前是看编译器的处理方式,有的是直接截断保留-3,也有的是取相近的整数-4,但是在c99之后,趋零截断的结果是-3,更加趋向0.
对于求模运算也是类似,有这样一个结论,在 % 运算中,如果第一位是正的,那么结果就是正的;负的相同。
公式:a%b = a-(a/b)*b
递增递减运算++、–
就是取代了"i = i+1"和"j = j-1",但是这里面有一个顺序的问题
因为++和–是可以放在变量的前面和后面,不同的顺序有不同的答案,下面只讨论++运算,–同理
- 对于 i++; 和 ++i; 这样单独的句子,两种是一样的。
- while(++s < 5)这样的句子,和(s++ < 5)就有所不同了,前面是先加一然后比较,后面是先比较,然后加一。
- b = a++和b = ++a 前面的是先将a赋值给b,然后a++,后面是先加后赋值
所以我们可以暂时得到一个结论,那就是在需要使用这个数据的时候,递增运算符在前面就先加,在后面就先使用然后加。
为什么是暂时,看下面
所以出现了一个例外,在对数组元素++前后是相同的(至少在cb的编译器上是这样的)
所以这就是C语言有混乱代码大赛的资本吧。。。
而且我在书上还找到了另外一个:
for(int i=1;i<10;)
{
printf("%d %d",i,i*i++);
}
本来想的是在i相乘完了之后可以直接加一,然后进行下一个循环,但是编译器可能是在加一之后再处理前面的i输出问题,所以输出可能就变成了 i+1和i2
至少我们有方法解决这个问题,那就是在区分不开的时候就分开使用,最简单也是最有效的。
- 一个表达式多次应用的变量不应该使用递增表达式
- 一个函数有多个参数带有该变量,不应该使用。
优先级问题:
++、–的优先级是很高的,除了括号之外就属他最高了,所以在x * ++y的时候就要小心了。
+=
a +=b其实就是a = a+b;如果等号左边项和第一位操作数是同一个变量,那么就可以缩写
类似的还有-= *= /=
注意两个运算符之间不可以加空格就行了,
一种缩写而已,不必在意