c – 易混乱和双重混乱

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标准准确描述了您的要求.书籍很好地学习基础知识或理论.编写重新标记标准中描述的所有技术细节的书籍是没有意义的.

转载注明原文:c – 易混乱和双重混乱 - 代码日志