最近我在一次面试中被问了一个问题,下面有一个定义的函数: int square(volatile int * p) { return *p**p; } 有人告诉我这个函数存在问题,不适合计算平方,我认为这是由于volatile关键字造成的,有人可以解释一下吗?
可能会有这样一种假设,因为*p是一个易变的访问,它的值在每次评估时可能会不同,因此您应该只评估一次: int q = *p; return q * q; 当然,这是一个愚蠢的设计;实际上应该是 int square(int) 函数,调用者应该使用 square(*p)。
volatile
表明*p
在*p * *p
的计算过程中可能会发生变化。特别是在嵌入式设备上,p
可能是任何奇怪的东西,例如指向某个内存的指针,其中一些硬件直接存储并不断更新计数器或其他东西的当前值,或者某种奇特的东西,每次读取时都会改变其值,或者其他什么,天空真的是极限。 - Jason C