Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #168619
| From | Keith Thompson <Keith.S.Thompson+u@gmail.com> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: for() syntax |
| Date | 2022-12-20 12:08 -0800 |
| Organization | None to speak of |
| Message-ID | <87h6xprg7o.fsf@nosuchdomain.example.com> (permalink) |
| References | (4 earlier) <87ili6unpn.fsf@bsb.me.uk> <tnsis8$mh7i$2@dont-email.me> <tnsl3s$mh7i$3@dont-email.me> <87pmceq6k2.fsf@nosuchdomain.example.com> <tnt0d6$mh7i$5@dont-email.me> |
Lew Pitcher <lew.pitcher@digitalfreehold.ca> writes:
> On Tue, 20 Dec 2022 10:22:05 -0800, Keith Thompson wrote:
>
>> Lew Pitcher <lew.pitcher@digitalfreehold.ca> writes:
>>> On Tue, 20 Dec 2022 15:03:36 +0000, Lew Pitcher wrote:
>>>
>>>> On Tue, 20 Dec 2022 14:57:56 +0000, Ben Bacarisse wrote:
>>> [snip]
>>>>>> The notable point is that the semicolon between clause-1 and
>>>>>> expression-2 is /not/ part of clause-1, but is, instead part of the
>>>>>> for statement itself.
>>>>>
>>>>> But that does not help if the grammar for a declaration still
>>>>> includes a semicolon. I wonder what all the relevant parts of the
>>>>> draft you are referring to look like when taken together.
>>>>>
>>>>>> Because of this, I don't believe that your count can be correct.
>>>>>> But, I'm willing to be educated on this :-)
>>>>>
>>>>> Well, I did add (but then deleted) that the count depends on how the
>>>>> grammar is structured. I should look at a more recent draft that
>>>>> will have taken the confirmed C11 text as a starting point. I might
>>>>> do that later, but I am in a rush!
>>>>
>>>> Perhaps I've got an outdated copy of the draft standard, and the semi-
>>>> colon question was asked and answered in a later release.
>>>>
>>>> Your explanation sounds valid to me. 'Tis a puzzle to be resolved
>>>> later.
>>>
>>> Oops... I found it.
>>>
>>> Under 6.8.5 Iteration statements Syntax
>>> ...
>>> for ( expression ; expression ; expression ) statement for (
>>> declaration expression ; expression ) statement
>>>
>>> (all expressions are marked optional)
>>>
>>> Crisis averted. You are indeed correct, and I've learned something new
>>> today. :-)
>>>
>>> But, that doesn't explain why 6.8.5.3 ("the for statement") shows the
>>> syntax it does. Perhaps the draft missed something in resolving the
>>> text between 6.8.5 and 6.8.5.3.
>>
>> Summary: You've found a bug in the standard, and not just in the draft.
>>
>> Yes, the grammar is defined in 6.8.5 "Iteration statements". The text
>> in 6.8.5.3 "The for statement" talks about the semantics of for
>> statements:
>>
>> The statement
>>
>> for ( clause-1 ; expression-2 ; expression-3 ) statement
>>
>> behaves as follows: [...]
>> If clause-1 is a declaration, [...]
>>
>> The problem is that if clause-1 is a declaration, it includes its own
>> trailing semicolon, which contradicts the grammar in 6.8.5.
>>
>> The ability to have a declaration in the header of a for statement was
>> introduced in C99 (borrrowed from C++). In C90, the "Iteration
>> statements" and "The for statement" sections were consistent, and the
>> grammar was
>>
>> for ( expression[opt] ; expression[opt] ; expression[opt ) statement
>>
>> (I use square brackets to denote a subscript.)
>>
>> My guess is that when the grammar was updated for C99, the author of the
>> update initially tried to have a unified grammar, replacing the first
>> expression by "clause-1" which could be either an expression or a
>> declaration. They then realized that semicolon caused a problem and
>> updated 6.8.5 accordingly, but forgot to update 6.8.5.3.
>>
>> This error occurs in the published C99 and C11 standards and in drafts
>> of C17 and C23 (N3054).
>
> Correct me if I'm wrong, but I believe that this "bug in the standard"
> goes a bit deeper than we've noticed.
[snip]
> Does not the second form of the for() statement
> for ( declaration expression[opt] ; expression[opt] ) statement
> permit the declaration part to /not/ have an initializer? As in
> for ( int i; i>0; ++i) continue;
Yes, it does.
> While it looks "legal" to me, it certainly seems suspect. I would
> have expected the standard to /require/ that the "declaration" part
> of the for() statement include an initializer.
Probably not an unreasonable expectation, but in fact the standard does
not require an initializer. (If it did, it would probably have been
expressed as a constraint, not as a grammar rule.)
There is a constraint in 6.8.5:
The declaration part of a for statement shall only declare
identifiers for objects having storage class auto or register.
which is why gcc rejected my attempt to use a typedef declaration.
I can't think of any *good* reason for the declaration not to include an
initializer, but the language doesn't require one (and there may well be
good reasons I haven't thought of).
Note that the feature came from C++, which lets you define constructors
that are invoked implicitly, so an initializer might not be needed.
--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
Working, but not speaking, for XCOM Labs
void Void(void) { Void(); } /* The recursive call of the void */
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Christmas Quiz 2022 Roman P <invalid@example.com> - 2022-12-18 20:00 +0000
Re: Christmas Quiz 2022 Tony Oliver <guinness.tony@gmail.com> - 2022-12-18 13:18 -0800
Re: Christmas Quiz 2022 Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-12-18 16:48 -0800
Re: Christmas Quiz 2022 Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-12-18 17:18 -0800
Re: Christmas Quiz 2022 "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2022-12-19 19:39 -0800
Re: Christmas Quiz 2022 Niles Rogoff <eternal-september@niles.xyz> - 2022-12-27 01:22 -0800
Re: Christmas Quiz 2022 Öö Tiib <ootiib@hot.ee> - 2022-12-27 01:58 -0800
Re: Christmas Quiz 2022 Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-12-27 10:25 -0800
Re: Christmas Quiz 2022 James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-12-27 05:07 -0500
Re: Christmas Quiz 2022 scott@slp53.sl.home (Scott Lurndal) - 2022-12-27 16:06 +0000
Re: Christmas Quiz 2022 scott@slp53.sl.home (Scott Lurndal) - 2022-12-27 17:42 +0000
Re: Christmas Quiz 2022 Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-12-27 13:53 -0800
Re: Christmas Quiz 2022 Niles Rogoff <eternal-september@niles.xyz> - 2022-12-27 01:24 -0800
Re: Christmas Quiz 2022 scott@slp53.sl.home (Scott Lurndal) - 2022-12-27 16:07 +0000
Re: Christmas Quiz 2022 Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-12-18 21:22 +0000
Re: Christmas Quiz 2022 Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2022-12-18 21:40 +0000
Re: Christmas Quiz 2022 Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-12-18 17:02 -0800
Re: Christmas Quiz 2022 Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-12-18 17:20 -0800
Re: Christmas Quiz 2022 red floyd <no.spam.here@its.invalid> - 2022-12-18 13:36 -0800
Re: Christmas Quiz 2022 "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2022-12-18 13:48 -0800
Re: Christmas Quiz 2022 Siri Cruise <chine.bleu@yahoo.com> - 2022-12-18 14:57 -0800
Re: Christmas Quiz 2022 "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2022-12-18 15:43 -0800
Re: Christmas Quiz 2022 Lynn McGuire <lynnmcguire5@gmail.com> - 2022-12-19 23:40 -0600
Re: Christmas Quiz 2022 "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2022-12-20 14:01 -0800
Re: Christmas Quiz 2022 Kaz Kylheku <864-117-4973@kylheku.com> - 2022-12-20 13:49 +0000
Re: Christmas Quiz 2022 Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-12-20 14:33 +0000
Re: Christmas Quiz 2022 Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2022-12-20 14:44 +0000
Re: Christmas Quiz 2022 Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-12-20 14:57 +0000
Re: Christmas Quiz 2022 Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2022-12-20 15:03 +0000
Re: Christmas Quiz 2022 David Brown <david.brown@hesbynett.no> - 2022-12-20 16:32 +0100
Re: Christmas Quiz 2022 Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2022-12-20 15:41 +0000
Re: Christmas Quiz 2022 Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-12-20 10:22 -0800
Re: for() syntax (Was: Christmas Quiz 2022) Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2022-12-20 18:54 +0000
Re: for() syntax Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-12-20 12:08 -0800
Re: for() syntax (Was: Christmas Quiz 2022) Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-12-26 06:48 -0800
Re: Christmas Quiz 2022 Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-12-26 06:25 -0800
Re: Christmas Quiz 2022 Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-12-26 06:24 -0800
Re: Christmas Quiz 2022 Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-12-26 13:05 -0800
Re: Christmas Quiz 2022 Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-12-20 12:46 -0800
Re: Christmas Quiz 2022 Paavo Helde <eesnimi@osa.pri.ee> - 2022-12-20 23:49 +0200
Re: Christmas Quiz 2022 Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-12-20 14:00 -0800
Re: Christmas Quiz 2022 Paavo Helde <eesnimi@osa.pri.ee> - 2022-12-21 00:13 +0200
Re: Christmas Quiz 2022 Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-12-20 14:38 -0800
Re: Christmas Quiz 2022 Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-12-20 21:31 -0800
Re: Christmas Quiz 2022 David Brown <david.brown@hesbynett.no> - 2022-12-21 12:02 +0100
csiph-web