C语言如何不使用“+”号进行加法运算!

来源:互联网 发布:网络活动策划书 编辑:程序博客网 时间:2024/05/16 14:19
如题,如果别人要你用c语言不用“+”号实行一次加法运算,你有什么办法呢?很多人都说,指针是c语言的灵魂那么,我们就试着使用指针和地址来尝试着进行一次不用“+”号的加法运算吧。

知道指针和数组还有数组指针吧?如果没学过,请点进指针与数组看一下什么是数组指针还有它可以做那些运算。
程序员,什么都不说,先来一段程序。指针与数组
那么p[1]是怎么样运算的呢?它的运算首先是把p[1]化成(p+1),也就是说“p[1]”与“(p+1)”等价。

看见没有,我们没有输入“+”号,而这里出现了“+”号。也就是说,我们可以通过类似“p[1]”这样的运算来获取“+”号然后进行加法运算。那么,我们如何能利用到它的加号呢?&和*符大家都知道吧?&是取地址符,*是跟&互逆的。

我们就试着运用&和*这两个符号在地址和数值中穿梭。首先,我们定义一个add函数

怎么把这个函数中的a和b不用”+”号就把它相加呢?我们试着使用上述提到的“p[1]”这形式引出“+”号。
因为使用“a[b]”的形式必须的把a或b转换成指针类型。那我们a强制转为指针类型试试,那转成什么类型的指针呢?因为“p[1]”等价于“(p+1)”,“p[2]”等价于“(p+2)”,p存放的是一个int类型的地址,int 类型的在64 位机占4个字节,32位机占2个字节,笔者的编译环境是在64为下编译,所以,p[1]和p[2]的地址的距离是4。所以地址增加应该为”p+1*sizeof(int)”,我们要用的是其中普通加法,所令sizeof()这个要等于1.所以我们选择把a强制转换char*类型;
现在,a[b]就等价于*(a+b)了,如何把*号去掉?这就得使用与它互逆的那个取地址符了这里写图片描述
现在是不是已经有了(a+b)了?但是,这样就行了么?我们编译一下看看有什么反应:看见没有,出现一个警告,|警告:分配整数指针没有cast。我们之前是不是把a强制转换成char*类型的了?那我们现在获得最终结果,要把结果强制转换成我们需要的类型,为了防止数据丢失,我们把它强制转换成long 类型,因为在64位机中指针字节是八位。所以,我们改成这样这里写图片描述
现在好了,没有警告,运行成功。恭喜你,实现了不用输入+号就能让两个数相加。That’s all.Thanks.
如有错误或不好的地方,请及时指出,谢谢合作。

1 0