这个函数返回什么

Inv*_*tus 2 c compiler-construction embedded volatile

如果在函数中传递的volatile变量如下所示...

此函数是否总是返回一个平方值,我的意思是有时值可以随着声明的volatile变量而改变.

基本上,我想说的是传递的变量是一个volatile.希望,我很清楚.但是,如果我通过引用传递将改变整个场景...我是对的吗?

volatile int a;
int main()
{
   function(a);
   return 1;
}
int function b(int a)
{

    int x=a;

    int y=a;

    return x*y;

}
Run Code Online (Sandbox Code Playgroud)

Cli*_*ord 7

volatile预选赛告诉变量,编译器可能会改变不在于它会改变.它无论如何都不能自发地改变; 某些东西必须导致它改变 - 即使这个原因在代码外部.

该代码是错误在这种情况下(或至少不例证效果volatile的方式也许你意),因为参数传递给function()声明不稳定.它与全局变量同名的事实可能令人困惑,但通过将全局变量赋值a给函数参数a,您可以立即将其与波动率分离.

如果代码被修改(并且有效且可编译),那么:

volatile int a;

int function( void )
{
    int x=a;
    int y=a;

    return x*y;
}

int main()
{
   function();
   return 1;
}
Run Code Online (Sandbox Code Playgroud)

那么volatile这里的效果就是编译器将显式地分配x并且y不应用任何可能的优化.如果没有限定符,编译器可能会(在启用优化时)减少function()到:

int function( void )
{
    return a * a ;
}
Run Code Online (Sandbox Code Playgroud)

甚至可以整列整个功能.此外,由于函数的返回值未分配给任何东西,编译器可能会将整个代码优化为just

int main()
{
   return 1;
}
Run Code Online (Sandbox Code Playgroud)

如果a是volatile,则调用to x,y 必须function()调用时发生.

目的volatile是向编译器指示变量可能在编译器生成的代码之外发生变化(而不是它将发生变化).当变量引用硬件寄存器或在线程,进程甚至处理器内的处理器或内核之间共享的内存时,它通常用于确保正确的行为.它还可以用于防止"优化"所需的代码(例如,空忙等待循环计数器).在您的示例中(或者更确切地说是我的修订版),a不引用任何此类实体,因此代码将按预期运行,但可能效率低于其他情况.


Jam*_*lis 5

global-scope volatile int a和function-scope int a参数之间没有关系.它们完全独立,a对函数内部的任何引用都是指int a参数.在volatile int a这个程序根本就不会使用.

如果你volatile int a将参数作为参数传递给函数,它就没有区别,因为它的值a将被读取一次并复制到函数的a参数中,而这本身并不是volatile.


R..*_*R.. 5

除非发生整数溢出,否则它总是返回一个正方形,在这种情况下,行为是未定义的.这volatile完全无关紧要的(我称之为红鲱鱼)但是因为全局volatile变量a甚至不在另一个a读取点的范围内.函数参数会a影响全局变量,并且由于它具有自动存储持续时间并且从不采用其地址,因此它完全不受任何类型的外部修改的影响.

当然,仍有很多方法可以通过调用未定义的行为来破坏程序状态,并发现返回值不是正方形.UB很有趣......