首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不能用这种方法计算一个数字的平方

不能用这种方法计算一个数字的平方
EN

Stack Overflow用户
提问于 2018-03-22 06:49:33
回答 2查看 0关注 0票数 0

我找到了一个计算数字平方的函数:

代码语言:txt
复制
int p(int n) {
    int a[n]; //works on C99 and above
    return (&a)[n] - a;
}

它返回N2的值。问题是,它是怎么做到的?经过一些测试,我发现(&a)[k](&a)[k+1]sizeof(a)/sizeof(int)。那是为什么?

EN

回答 2

Stack Overflow用户

发布于 2018-03-22 14:55:21

显然是黑客,但是一种不用使用*操作员(这是编码竞赛的要求)。

代码语言:txt
复制
(&a)[n] 
代码语言:txt
复制
(a + sizeof(a[n])*n)

因此整个表达式是

代码语言:txt
复制
  (&a)[n] -a 

= (a + sizeof(a[n])*n -a) /sizeof(int)

= sizeof(a[n])*n / sizeof(int)
= sizeof(int) * n * n / sizeof(int)
= n * n
票数 0
EN

Stack Overflow用户

发布于 2018-03-22 16:44:55

要理解这个黑客,首先需要理解指针的差异,即当两个指针指向同列被减去了吗?

当一个指针从另一个指针中减去时,结果是指针之间的距离(以数组元素度量)。所以如果p指点a[i]q指点a[j],然后p - q等于i - j

C11:6.5.6加法算子(P9):

当两个指针被减去时,两者都应指向同一数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素下标的差异。 换句话说,如果PQ分别指向i-第四和j-数组对象的第四个元素,表达(P)-(Q)有价值i−j如果该值与类型的对象相匹配ptrdiff_t

现在我希望您知道数组名称转换为指针,a将指针转换为数组的第一个元素a,&a是整个内存块的地址,即它是数组的地址。

这将帮助你理解为什么a&a有相同的地址和方式(&a)[i]是ith数组的地址

所以,声明

代码语言:txt
复制
return (&a)[n] - a; 

等于

代码语言:txt
复制
return (&a)[n] - (&a)[0];  

这个差异将给出指针之间的元素数。(&a)[n](&a)[0],它们是n数组nint元素。因此,总数组元素是n*n=n2.

注:

C11:6.5.6加法算子(P9):

如果减去两个指针,两者都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素。结果是两个数组元素下标的差异。结果的大小是实现定义的。,它的类型(有符号整数类型)是ptrdiff_t中定义的<stddef.h>头球。如果结果在该类型的对象中不可表示,则行为是未定义的。undefined

(&a)[n]既不指向同一个数组对象的元素,也不指向数组对象的最后一个元素,(&a)[n] - a会调用未定义行为

还请注意,最好更改函数的返回类型。pptrdiff_t.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档