作为参数标识符的volatile

4

最近我在一次面试中被问了一个问题,下面有一个定义的函数:

int square(volatile int * p)
{
    return *p**p;
}

有人告诉我这个函数存在问题,不适合计算平方,我认为这是由于volatile关键字造成的,有人可以解释一下吗?


因为volatile表明*p*p * *p的计算过程中可能会发生变化。特别是在嵌入式设备上,p可能是任何奇怪的东西,例如指向某个内存的指针,其中一些硬件直接存储并不断更新计数器或其他东西的当前值,或者某种奇特的东西,每次读取时都会改变其值,或者其他什么,天空真的是极限。 - Jason C
2
通常情况下,在这个函数中不需要涉及任何指针... - Daniel Jour
我说过,就像@Kerrek SB所说的那样,直接写会更简单,但他们说这会使指向的值乘以自身,但不适合计算平方,而且该函数在语法上是有效的。 - Uint32
1
@Uint32 这个主题有很多好的文章可以在这里找到:http://www.barrgroup.com/Embedded-Systems/How-To/Articles - Lundin
1
@Uint32:Lundin所说的是,在Embedded.com上有许多Micheal Barr的文章。你可以用各种嵌入式系统开发方面的书籍填满书架。如果需要一份全面的综合性覆盖,考虑Colin Walls的《嵌入式软件:完整指南》-他也是Embedded.com和其他出版物上许多文章的作者。 - Clifford
显示剩余5条评论
1个回答

7

可能会有这样一种假设,因为*p是一个易变的访问,它的值在每次评估时可能会不同,因此您应该只评估一次:

int q = *p;
return q * q;

当然,这是一个愚蠢的设计;实际上应该是 int square(int) 函数,调用者应该使用 square(*p)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接