我将以非常简化的形式陈述我的问题,即:
如果我输入C
void main(){
int a=3+2;
double b=7/2;
}
a和b的时候会分配它们的值为5和3.5是在我编译代码时还是在我运行代码时它?
换句话说,当我按下编译时会发生什么?以及它与我按下运行时的情况有何不同,在分配值和进行计算方面,与编写代码的方式有何不同:
void main(){
int a=5;
double b=3.5;
}
我问这个是因为我听说过编译器优化,但实际上并不是我的区域。
任何评论,评论都将受到高度赞赏。 谢谢。
答案 0 :(得分:7)
由于您询问“代码优化” - 优秀的优化编译器会将此代码优化为void main(){}
。 <{1}}和a
将完全取消。
此外,b
,而不是3.5
答案 1 :(得分:2)
编译会将高级语言翻译成较低级的语言,例如汇编语言。一个好的编译器可以优化,这可以自定义(例如使用-O2
)选项左右。
关于您的代码,double b=7/2;
将产生3.0
而不是3.5
,因为您执行整数和整数运算。如果您希望3.5
,则应该像double b=7.0/2.0;
那样执行此操作。这是人们常犯的错误。
答案 2 :(得分:1)
答案 3 :(得分:1)
当我按下编译时会发生什么?
没人知道。编译器可以将其优化为常量,或者可以不是。它可能会,但不是必须的。
你通常不应该担心或者甚至不考虑编译器优化,除非你处于绝对需要它的位置,很少有开发人员。编译器通常可以做得比你做得更好。
答案 4 :(得分:1)
我对优化也一无所知,但我决定试一试。使用,gcc -c -S test.c
我得到了函数的程序集。以下是int a = 3 + 2
行的结果。
movl $5, -4(%rbp)
对我来说,它在编译时将值(3 + 2)转换为5,但它取决于编译器和平台以及传递它的任何标志。
(另外,我让函数返回a
只是为了不会完全优化代码。)