July 24, 2013 Re: Is this documented behaviour? | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Tuesday, 23 July 2013 at 16:34:54 UTC, John Colvin wrote:
> void foo(ref int a)
> {
> a = 5;
> }
>
> void main()
> {
> int a = 0;
> int* aptr = &a;
>
> foo(*aptr);
> assert(a == 5);
>
> a = 0;
>
> int b = *aptr;
> foo(b);
> assert(b == 5);
> assert(a == 0);
> }
>
> The fact that adding an explicit temporary changes the semantics seems weird to me.
Thanks for the explanations people, I have now fixed a rather worrying mistake in my programming knowledge: WHAT IT ACTUALLY MEANS TO DEREFERENCE A POINTER!
Seriously, I've written programs in assembly and I still had it wrong. It's a wonder I ever wrote any correct code in my life.
|
July 27, 2013 Re: Is this documented behaviour? | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Wednesday, 24 July 2013 at 15:14:16 UTC, John Colvin wrote:
> On Tuesday, 23 July 2013 at 16:34:54 UTC, John Colvin wrote:
>> void foo(ref int a)
>> {
>> a = 5;
>> }
>>
>> void main()
>> {
>> int a = 0;
>> int* aptr = &a;
>>
>> foo(*aptr);
>> assert(a == 5);
>>
>> a = 0;
>>
>> int b = *aptr;
>> foo(b);
>> assert(b == 5);
>> assert(a == 0);
>> }
>>
>> The fact that adding an explicit temporary changes the semantics seems weird to me.
>
> Thanks for the explanations people, I have now fixed a rather worrying mistake in my programming knowledge: WHAT IT ACTUALLY MEANS TO DEREFERENCE A POINTER!
>
> Seriously, I've written programs in assembly and I still had it wrong. It's a wonder I ever wrote any correct code in my life.
To put the final nail in the coffin, this also works in C++:
#include "stdio.h"
void change(int & x) {
x = 4;
}
int main(int argc, char** argv) {
int a = 0;
int* aptr = &a;
change(*aptr);
printf("%d\n", a);
}
TBH, I was also a bit surprised because I assumed *aptr as an rvalue created a temporary, but as you mentioned, that's not how it works in assembly, so it's wrong to think it would work differently in C/C++/D.
Thanks for the post!
|
Copyright © 1999-2021 by the D Language Foundation