假设我们在Algol 68和C中分别有以下指令:
ref int x := 5;(int*) x = 5;它们的语义有什么不同?,还是一样的?,因为我认为第二个表示类似“x将指向一个常量”(无法编译),第一个表示“x将指向一个内存单元,该内存单元指向另一个包含常量5的内存单元”对吗?如果没有,你能解释一下并举例说明吗?

最佳答案

我不假装是专家-我从来没有用任何一种语言编译过任何东西。
然而,维基百科上说:
然而,声明real x;只是ref real x = loc real;的语法糖也就是说,x实际上是引用新生成的局部real变量的常量标识符。
有了这个解释,问题的算法片段:

ref int x := 5;

与C代码相对应(或多或少):
int *x = malloc(sizeof(*x));
*x = 5;

搁置错误检查和释放分配内存的问题。
问题是C片段:
(int *)x = 5;

在很大程度上没有意义-强制转换的结果不是可修改的左值,并且只能指定给可修改的左值如果重写为:
int x_data;
int *x = &x_data;
*(int *)x = 5;

然后它就变成了有效的C,尽管cast完全是多余的当然,它也可以写为使用内存分配在C语言中,使用x访问整数值(与指针相反)需要在C语言中取消引用(*xx[0])。相比之下,在Algol 68中,不需要显式地取消对变量x的引用。
尽管这个问题多次提到“常量”,但我看不出任何东西暗示代码中的常量值5分配给某个位置的变量存储在该位置的值可以稍后通过另一个赋值进行更改。
题目是关于cast的问题,但是我在Algol代码中看不到cast的证据,也不清楚为什么在C代码中需要cast。

关于c - 类型转换中Algol和C的语义差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41993990/

10-10 09:58