Why is size_t unsigned?

monarch_dodra monarchdodra at gmail.com
Mon Jul 22 08:51:44 PDT 2013


On Monday, 22 July 2013 at 15:39:11 UTC, Maxim Fomin wrote:
> On Monday, 22 July 2013 at 15:04:25 UTC, monarch_dodra wrote:
>> On Monday, 22 July 2013 at 12:51:31 UTC, Andrej Mitrovic wrote:
>>> On 7/22/13, JS <js.mdnq at gmail.com> wrote:
>>>> foreach doesn't allow you to modify the index to skip over
>>>> elements.
>>>
>>> It does:
>>>
>>> -----
>>> import std.stdio;
>>>
>>> void main()
>>> {
>>>   int[] x = [1, 2, 3, 4, 5];
>>>   foreach (ref i; 0 .. 5)
>>>   {
>>>       writeln(x[i]);
>>>       ++i;
>>>   }
>>> }
>>> -----
>>>
>>> Writes:
>>> 1
>>> 3
>>> 5
>>
>> 99% sure that's unspecified behavior. I wouldn't rely on 
>> anything like that.
>
> Of course it is specified behavior.
>
> ForeachStatement:
>     Foreach (ForeachTypeList ; Aggregate) 
> NoScopeNonEmptyStatement
>
> Foreach:
>     foreach
>     foreach_reverse
>
> ForeachTypeList:
>     ForeachType
>     ForeachType , ForeachTypeList
>
> ForeachType:
>     refopt BasicType Declarator
>     refopt Identifier
>
> Aggregate:
>     Expression

So... you are saying that if the grammar allows it, then the 
behavior is specified?

All I see, is you iterating over references to the elements of an 
aggregate. The final behavior really depends on how said 
aggregate is implemented. If anything, if the behavior *was* 
defined, then I'd simply argue the behavior is wrong: I don't see 
why changing the values of the elements of the aggregate should 
change the amount of elements you iterate on at all. Also:

//----
     int[] x = [1, 2, 3, 4, 5];
     foreach (ref i; iota(0, 5))
     {
         writeln(x[i]);
         ++i;
     }
//----

This also compiles, but I used a different aggregate, yet 
represents the same thing. Because it is implemented differently, 
I get a completely different result. Unless I'm mistaken, when a 
result depends on the implementation, and the implementation 
doesn't state what the result is, then that's what unspecified 
behavior is. (unspecified, not undefined).

> This is an example of unspecified behavior:
>
> import std.stdio;
>
> void main()
> {
>     int[] x = [1, 2, 3, 4, 5];
>     foreach (ref i; 0 .. 5)
>     {
>         __limit1631--;
>         writeln(x[i]);
>     }
> }

What is "__limit1631" ? Doesn't compile for me.


More information about the Digitalmars-d-learn mailing list