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