c语言中如何不使用加号,完成两个数字相加

c语言中如何不使用加号,完成两个数字相加
在c语言中,我们经常求两个数字加和的时候,通常会使用+ ,来将两数相加得出相加结果。
例如:

#include "stdio.h"
int main()
{
    int a=3;
    int b=2;
    printf("%d\n",a+b);
    return 0;
}

这样输出的结果为:
5

那么我们不使用加号如何得出a+b=5的结果呢?
首先我们来聊一聊“ [ ]” 下标运算符。
下标运算符 一般多使用在数组中,用来访问数组中的特定元素。
例如:

#include "stdio.h"
int main()
{
    int a[4]={0,1,2,3};
    int i;
    for(i=0;i<4;i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

这段程序的输出结果为:
0 1 2 3
因为数组下标是从0开始的,所以a[0]是数组中的第一个元素,a[i]表示访问数组中的第i+1个元素,当然i的大小要小于4,不能大于或等于4,否则会发生越界。
当然 a[i]的形式也可以表示为 *(a+i)的形式,也可以访问对应数组的元素,这是指针形式,因为数组名是一个地址常量,保存着该数组的首地址,
也就是a=&a[0],a[i]和*(a+i)的效果相同,表示从a这个地址开始,向后移动i个单位(注:此处单位和字节数不同),单位的大小由 a的类型来决定,如果a的类型为 int,则这个单位的大小为4字节,那就意味着i每加一,就从a的地址向后移动4个字节访问。(如果为double类型则为8字节,与其数据类型所占字节数相同。)
因为a[i]可以表示为*(a+i),其中有加号出现,我们可以尝试利用该方法 构造出a+b,下面是 用该方法实现的代码,请先尝试阅读,体会。

#include "stdio.h"
long add();
int main()
{
    int x;
    int y;
    scanf("%d %d",&x,&y);
    printf("%ld\n",add(x,y));
    return 0;
}
long add(int x,int y)
{
    return (long)(&((char*)x)[y]);
}

运行程序输入2 3,就会得到结果5
这里写图片描述
这个程序实现x+y的核心在add函数中

return (long)(&((char*)x)[y]);

先将x强制转换为 char *,字符指针类型,x的值本来为2
,强制类型转换后就变成了地址 00000002,后面又有一个下标运算符[y],y的值为3。
(char*)x [y]相当于*(x+y)(能这样表示是因为,经过强制类型转换后,x是一个字符型指针),又因为x为一个字符型指针,char类型的大小为1字节,,所以在向后移动3个单位后,地址的值就变成了00000005
(char*)x [y]相当于*(x+y)
前面有个*号要进行一次对该地址的取值运算,所以在前面加一个&
和*号抵消
&((char*)x)[y]的值就为地址00000005
在前面加上强制类型long 类型(在这里声明一下为什么是long类型,因为笔者使用的是64为系统,指针的大小是8字节,64位,如果此处强制转换为int类型,int类型只有四字节,从八字节转换到四字节,可能会造成数据丢失,所以此处选择了long类型)就将地址00000005这个值 转换成 5 ,然后返回输出,得出结果5

这个不使用+号实现 a+b的方法,是一位学长讲给我的,在这里非常谢谢这位学长,开句玩笑的说,个人 感觉这个方法好鬼畜。。。
谢谢各位观看,第一次写博客,非常生疏,如果有不对的地方,轻喷,我会及时改正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值