我有一个简短的问题,想要避免测试(虽然我真的 应该 测试以确保绝对正确):
以下是一段C代码:
r1 = fun1();
r2 = fun2();
if (r1 && r2)
{
// do something
}
在代码中,除了 if (...)
语句之外,变量 r1
和 r2
没有被使用。这两个函数都会被执行吗?我担心编译器可能会通过消除 r1
和 r2
来优化代码,使代码看起来像这样:
if (fun1() && fun2())
{
// do something
}
在这种情况下,首先会评估
fun1()
,如果返回FALSE
,则fun2()
将根本不会被评估。这不是我想要的,这就是我在第一个代码段中编码的原因。如何确保始终评估函数?我认为可以通过将其分配给变量来实现,但是如果编译器看到该变量实际上从未在代码中后面使用过,那么我会担心编译器优化......
我知道可以通过将
r1
和r2
声明为volatile
来实现此目的,但我想知道是否有更优雅的解决方案。非常感谢您对此问题的任何评论!
编辑:感谢所有回复的人。我刚刚在我的项目中使用了第一个代码片段(它是基于ARM Cortex-M7的嵌入式系统)。似乎编译器并没有像我上面所示的那样优化代码,并且
fun1()
和fun2()
都被评估(应该是这样)。此外,使用r1
和r2
声明为volatile
编译代码产生的二进制输出与将r1
和r2
作为普通变量声明时完全相同(即volatile
关键字根本不会改变编译器输出)。这使我确信,第一个代码片段实际上是在处理后跟随的if(...)
语句之前评估两个函数的保证方式。