Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Bart Newsgroups: comp.lang.c Subject: Re: question about linker Date: Sat, 7 Dec 2024 14:57:17 +0000 Organization: A noiseless patient Spider Lines: 82 Message-ID: References: <87plmfu2ub.fsf@nosuchdomain.example.com> <87frnbt9jn.fsf@nosuchdomain.example.com> <877c8nt255.fsf@nosuchdomain.example.com> <20241129142810.00007920@yahoo.com> <20241129161517.000010b8@yahoo.com> <87ldwx10gv.fsf@bsb.me.uk> <86ser1kgp5.fsf@linuxsc.com> <87ldwtzlc0.fsf@nosuchdomain.example.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sat, 07 Dec 2024 15:57:16 +0100 (CET) Injection-Info: dont-email.me; posting-host="92f4e16e4a21192eb5e2d0ba1a6ec304"; logging-data="3301918"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19hsvcOpQmKbZaD5/uMf+v2" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:ML7eOxAyB8tfxc0cqK59nKetUkU= Content-Language: en-GB In-Reply-To: Bytes: 4706 On 07/12/2024 13:04, Bart wrote: > On 07/12/2024 11:34, Janis Papanagnou wrote: >> On 06.12.2024 02:20, Bart wrote: > >>> I used to be puzzled by this too: 'while' can both start a while >>> statement, and it can delimit a do-while statement. How is that >>> possible? >> >> A keyword (like 'while') is just a lexical token that can be used in >> different syntactical contexts. > > Is it common to both start and end a statememt with the same keyword? > > >  (Even with different semantics, if a >> language designer thinks this is a good idea for his case.) >> >> You may be less confused with using Pascal; > > Now you are demonstrating my point about being treated like a beginner. > And it is exasperating. > > This is a point of language design. C's approach works - just. But it > relies on some subtlety. 'while (cond)' both starts a statement, and can > end a statement: > >    do while(cond) do ; while (cond); > > The second 'while' here starts a nested while-loop inside a do-while > loop. Not confusing? It is to me! I couldn't finish my example as I got > lost (but as it happens, this is valid code, partly by luck). > > Of course, if you put aside all other matters and concentrate on the > minutiae of the syntax details, then it is all 'obvious'. I think it > needs to be a lot more obvious. > >>    while positive-case do ... >>    until negative-case do ... >>    do ... while positive-case >>    do ... until negative-case >> (depending on language with this of similar syntax). >> >> There's nothing wrong using the same keyword for the same type of >> condition, rather it's good to have it defined that way. > > The problem here is exactly the same: how do you tell whether the > 'while' in 'do ... while' is ending this 'do'-loop, or starting a nested > while-loop? > > You don't think there is an element of ambiguity here? > > Let's take my example again: > >    do while(cond) do ; while (cond); > > And make a small tweak: > >    do ; while(cond) do ; while (cond); > > It still compiles, it is still valid code. But now it does something > utterly different. (One is two nested loops, the other is two > consecutive loops - I think!) Correction: the versions I tested don't have that 'do' in the middle. The two examples need to be written like this to be valid: do while (cond) ; while (cond); do ; while (cond) ; while (cond); So this /is/ two nested loops followed by two consecutive ones. The difference is that semicolon. In a syntax where newlines may be injecting semicolons, such a subtle distinction is not strong enough. As I originally said, it's fragile. Those suggesting that semicolons are unimportant details of syntax in C are wrong. They can make a significant difference and contribute to errors: for (i=0; i