C的常见运算符问题(sizeof、++、%和+=)

本文深入探讨C语言中的四则运算、求模运算、递增递减运算、sizeof运算符及优先级问题,解析C99标准下int型运算的变化,提供实例说明各种运算符的使用场景与注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四则运算

这个就不耽误大家时间了,就是正常生活中的运算就行了,优先级什么的都是正常,不用担心编译器的问题,你只管开车办法老爹来想。(雾)

其他运算符

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;如果等号左边项和第一位操作数是同一个变量,那么就可以缩写
类似的还有-= *= /=
注意两个运算符之间不可以加空格就行了,
一种缩写而已,不必在意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值