c++ - 我必须使用 0.f 初始化 float 吗?

标签 c++ variables initialization

当我在我的程序中初始化 float 变量时,我通常有这样的 vector :

Vector forward(0.f,0.f,-1.f),right(1.f,0.f,0.f),up(0.f,1.f,0.f)

( vector 只是 3 个 float ,如 struct Vector{ float x,y,z; };)

这看起来更容易阅读:

Vector forward(0,0,-1),right(1,0,0),up(0,1,0)

我必须使用 float 来初始化我的 float 变量吗?当我使用整数(或 double)初始化 float 时,我是否会丢失任何东西或招致某种惩罚?

最佳答案

两者之间没有语义差异。不过,根据某些编译器的不同,可能会生成额外的代码。另见 thisthis SO 相同主题的问题。

我可以确认 gcc 为所有变体生成相同的代码

int main()
{
    float a = 0.0f; /* or 0 or 0.0 */
    return 0;
}

并且这段代码是

    .file   "1.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0x00000000, %eax
    movl    %eax, -4(%rbp)
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section    .note.GNU-stack,"",@progbits

相关行是

    movl    $0x00000000, %eax

a 更改为 0.1(或 0.1f)会将行更改为

    movl    $0x3dcccccd, %eax

gcc 似乎能够推导出正确的常量并且不会生成额外的代码。

关于c++ - 我必须使用 0.f 初始化 float 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12637581/

相关文章:

c++ - 在成员函数中我得到错误 "invalid use of undefined type ' struct (name )' - forward declaration of ' struct (name )' "

c++ - 允许在没有 Active Directory 信任的情况下进行 winhttp 委派

c++ - 您知道用于编辑/翻译资源 (.rc) 文件的好程序吗?

python itertools.combinations 已删除

java - 如何在 Java 中创建包含运算符的变量?

Python空构造函数

java - 在 Controller JavaFX 的初始化方法中获取 NullPointerException

c++ - 大数库的通用包装类

c++ - 为什么文件范围静态变量必须被零初始化?

shell - 将子脚本中声明的变量调用到父 shell 脚本