Suppose we have the following instructions in Algol 68 and C, respectively:
ref int x := 5;
and (int*) x = 5;
. What are their semantic difference?, it's the same?, because I think that the second one says something like "x will point to a constant" (it can't be compiled) and the first one says "x will point to a memory cell that points to another memory cell that contains a constant, 5". Is it correct?, if not, can you explain it a bit and give some examples to understand this?
I don't pretend to be an Algol 68 (or Algol 60) expert — I've never compiled a thing in either language.
However, Wikipedia on Algol 68 mode declarations says:
However, the declaration
real x;
is just syntactic sugar forref real x = loc real;
. That is,x
is really the constant identifier for a reference to a newly generated localreal
variable.
Given that explanation, the question's Algol fragment:
ref int x := 5;
corresponds (more or less) to the C code:
int *x = malloc(sizeof(*x));
*x = 5;
putting aside issues of error checking and release of the allocated memory.
The question's C fragment:
(int *)x = 5;
is largely meaningless — the result of a cast is not a modifiable lvalue, and you can only assign to a modifiable lvalue. If rewritten as:
int x_data;
int *x = &x_data;
*(int *)x = 5;
then it becomes valid C, though the cast is wholly superfluous. It could also be written to use memory allocation, of course. In C, any use of x
to access an integer value (as opposed to a pointer) requires dereferencing in C (*x
or x[0]
). By contrast, in Algol 68, there's no need to explicitly dereference the variable x
.
Although the question mentions 'constant' a couple of times, I see nothing that implies constancy in the code. The value 5
is assigned to a variable in a location. The value stored in the location can be changed later by another assignment.
The question title asks about casting, but I see no evidence of a cast in the Algol code, and it is not clear why a cast is considered necessary in the C code.