int x = 2; volatile int y = 2; const int z = x/y; int main(){ int x = 2 + 3; double d = 7 / 3; }
我这里有三个问题:
首先,在这种情况下,编译器可以在编译时计算’z’的值为1吗?
其次,我观察到编译器不生成用于添加2和3来初始化x的汇编指令.它用5直接初始化x.用’d’可以做同样的事情吗?
第三,有没有关于这两个概念的好书?标准中的任何引用都会有所帮助(标准文档似乎是一个有趣的地方,虽然非常可怕)
解决方法
Firstly,can the compiler calculate the value of the ‘z’ at compile time to be 1 in this case?
读取或写入被认为具有副作用的volatile变量,因此不允许编译器执行此操作.
Secondly,I observed that the compiler does not generate assembly instructions for adding 2 and 3 to initialize x. It directly initializes x with 5. Can the same be done with ‘d’?
是.只要编译器可以证明没有副作用.例如.如果在计算过程中发生溢出或除零,则无法在编译时计算它,因为计算应在运行时触发cpu异常.
Thirdly,Is there any good book to read on these two concepts?
是. C ISO标准准确描述了您的要求.书籍很好地学习基础知识或理论.编写重新标记标准中描述的所有技术细节的书籍是没有意义的.