我从来没有真正理解发生在当涉及到铸什么。 我以为隐式转换发生在编译时(如果我错了指正),但对于这样的:
int i = 0;
double d = sqrt((double)i);
这是否会发生在编译时/运行时间?
答案 0 :(得分:6)
没关系,也没有指定(检查C11标准n1570)。请注意as-if规则。它实际上取决于你的编译器是如何optimizing
如果仅将代码放入某个main
函数中,并在启用优化的情况下对其进行编译,则GCC编译器将为您提供一个空程序(因为所有计算都可以在编译时完成,并且因为d
不用于可观察到的副作用。
如果您有GCC编译功能使用您的代码gcc -O3 -S -fverbose-asm
,并期待产生*.s
汇编文件中。你会感到惊讶。
特别是在Linux / Debian / x86-64上的GCC 8中,
的编译// file dvep.c
#include <math.h>
int
main (void)
{
int i = 0;
double d = sqrt ((double) i);
return 0;
}
使用gcc -O3 -S -fverbose-asm dvep.c
命令产生dvep.s
的文件,其main
功能降低为:
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
# dvep.c:9: }
xorl %eax, %eax #
ret
.cfi_endproc
然后您看到main
内的运行时没有浮点运算
答案 1 :(得分:6)