可以在编译时执行具有常量参数的 C 标准库函数吗?

Can C standard library functions with constant argument(s) be executed at compile time?

可以如下代码:

float f = sinf(0.5f);

优化为如下代码(其实是伪代码给个思路):

float f = 0x1.eaee88p-2f;
feraiseexcept(FE_INEXACT);

其他C标准库函数同理。据我所知,由于“整个语言是基于”抽象机器“()的(相当无用的)概念,因此“实现可以自由地以优化方式做任何事情,只要侧效果和“可观察到的行为”受到尊重”(相同link)。

一些编译器会将其优化为简单的常量表达式。这是因为编译器知道标准库中的函数是如何工作的。编译器知道 sinf 没有副作用。

int main(void)
{
    float f = sinf(0.5f);
    printf("%f\n", f);
} 
.LC1:
        .string "%f\n"
main:
        sub     rsp, 8
        mov     edi, OFFSET FLAT:.LC1
        mov     eax, 1
        movsd   xmm0, QWORD PTR .LC0[rip]
        call    printf
        xor     eax, eax
        add     rsp, 8
        ret
.LC0:
        .long   -2147483648
        .long   1071558376