What is a "comma expression"?
Elmar
chrehme at gmx.de
Sun Oct 10 12:13:47 UTC 2021
On Sunday, 10 October 2021 at 12:01:33 UTC, rempas wrote:
> This is the first time I'm finding something like that. I'm
> having the following code in C:
>
> ```
> if (0 == (i >> 7)) {
> if (len < 1) return -1;
> v = i;
> return *ret = v, 1;
> }
> ```
>
> This is part of a function that returns an `int`. When I'm
> running this in C, it works. However in D, I'm getting the
> following error message:
>
> ```
> Error: Using the result of a comma expression is not allowed
> ```
>
> Can someone explain what comma expressions are and why they
> don't work in D (or if the only doesn't work as returned values
> from a function)?
Hello rempas.
The comma-operator `,` is like `;` but results in an expression
value, not a statement like `;` would. The left side of `,` is
executed like a statement and the value of the right side of `,`
is returned. Comma-expressions are merely used to pack additional
instructions into places where only expressions are allowed.
```d
if (x = y, myNiceFunction(), yay(x), x > 5)
{
// ...
}
```
or
```d
if (hasFancyFunkyStuff)
x = z, fancy(x), funkyUpdate(z); // too lazy for braces
```
Many consider the `,` operator to be a design-flaw because it
makes expressions difficult to read and can be easily abused
because the above should actually be:
```d
x = y;
myNiceFunction();
yay(x);
if (x > 5)
{
// ...
}
```
In `D` you can still write the second example of code but not the
first example of code. The designers of D thought they could make
it less painful by just forbidding comma-expressions to be used
as expression value and only as statement. This is because then
comma-expressions can still be used in `for`-loops:
```d
for (x = y, z = a; x < z; x++, z--)
{
;
}
```
In conclusion, your C snippet should actually look like:
```c
if (0 == (i >> 7))
{
if (len < 1)
return -1;
*ret = v = i;
return 1;
}
```
The previous snippet even could mislead readers to think that it
would return a tuple of two elements which it doesn't.
More information about the Digitalmars-d-learn
mailing list