Deutsch English Français Italiano |
<vg358c$3bk7t$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder2.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Bart <bc@freeuk.com> Newsgroups: comp.lang.c Subject: Re: else ladders practice Date: Fri, 1 Nov 2024 18:05:02 +0000 Organization: A noiseless patient Spider Lines: 127 Message-ID: <vg358c$3bk7t$1@dont-email.me> References: <3deb64c5b0ee344acd9fbaea1002baf7302c1e8f@i2pn2.org> <vg0t3j$2ruor$1@dont-email.me> <78eabb4054783e30968ae5ffafd6b4ff2e5a5f17@i2pn2.org> <vg2g37$37mh3$1@dont-email.me> <6724CFD2.4030607@grunge.pl> <vg2llt$38ons$1@dont-email.me> <2491a699388b5891a49ef960e1ad8bb689fdc2ed@i2pn2.org> <b681ee05856e165c26a5c29bf42a8d9d53843d6d@i2pn2.org> <vg2ttn$3a4lk$1@dont-email.me> <vg33gs$3b8n5$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Fri, 01 Nov 2024 19:05:01 +0100 (CET) Injection-Info: dont-email.me; posting-host="043844d4a216b291756c29a01a715cc9"; logging-data="3526909"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+ke3rRgOpqJeR9Toademy4" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:+yjNSBcoeHrSEOrqBu2x14c6EaU= In-Reply-To: <vg33gs$3b8n5$1@dont-email.me> Content-Language: en-GB Bytes: 5634 On 01/11/2024 17:35, David Brown wrote: > On 01/11/2024 16:59, Bart wrote: >> On 01/11/2024 14:17, fir wrote: >>> fir wrote: >>>> Bart wrote: >>>>> On 01/11/2024 12:55, fir wrote: >>>>>> Bart wrote: >>>>>>> On 01/11/2024 11:32, fir wrote: >>>>>>>> Bart wrote: >>>>>>>>> ral clear patterns here: you're testing the same variable 'n' >>>>>>>>> against >>>>>>>>> several mutually exclusive alternatives, which also happen to be >>>>>>>>> consecutive values. >>>>>>>>> >>>>>>>>> C is short of ways to express this, if you want to keep those >>>>>>>>> 'somethings' as inline code (otherwise arrays of function >>>>>>>>> pointers or >>>>>>>>> even label pointers could be use >>>>>>>> >>>>>>>> so in short this groupo seem to have no conclusion but is tolerant >>>>>>>> foir various approaches as it seems >>>>>>>> >>>>>>>> imo the else latder is like most proper but i dont lkie it >>>>>>>> optically, >>>>>>>> swich case i also dont like (use as far i i remember never in my >>>>>>>> code, >>>>>>>> for years dont use even one) >>>>>>>> >>>>>>>> so i persnally would use bare ifs and maybe elses ocasionally >>>>>>>> (and switch should be mended but its fully not clear how, >>>>>>>> >>>>>>>> as to those pointer tables im not sure but im like measurad it >>>>>>>> onece >>>>>>>> and it was (not sure as to thsi as i dont remember exactly) slow >>>>>>>> maybe >>>>>>>> dependant on architecture so its noth wort of use (if i remember >>>>>>>> correctly) >>>>>>> >>>>>>> Well, personally I don't like that repetition, that's why I >>>>>>> mentioned >>>>>>> the patterns. You're writing 'n' 5 times, '==' 5 times, and you're >>>>>>> writing out the numbers 1, 2, 3, 4, 5. >>>>>>> >>>>>>> I also don't like the lack of exclusivity. >>>>>>> >>>>>>> However I don't need to use C. If those 'somethings' were simple, or >>>>>>> were expressions, I could use syntax like this: >>>>>>> >>>>>>> (n | s1, s2, s3, s4, s5) >>>>>>> >>>>>> >>>>>> on a C ground more suitable is >>>>>> >>>>>> {s1,s2,s3,s4,s5)[n] >>>>>> >>>>>> //which is just array indexing >>>>> >>>>> No, it's specifically not array indexing, as only one of s1 - s5 is >>>>> evaluated, or nothing is when n is not in range, eg. n is 100. >>>>> >>>>> You could try something like that in C: >>>>> >>>>> int x; >>>>> >>>>> x = ((int[]){(puts("a"),10), (puts("b"),20), (puts("c"), 30), >>>>> (puts("d"),40)})[3]; >>>>> >>>>> printf("X=%d\n", x); >>>>> >>>>> The output is: >>>>> >>>>> a >>>>> b >>>>> c >>>>> d >>>>> X=40 >>>>> >>>>> Showing that all elements are evaluated first. If index is 100, the >>>>> result is also undefined. >>>>> >>>>> >>>> :-O >>>> what is this, first time i see such thing >>>> >>> im surprised that it work, but in fact i meant that this syntax is >>> old c compatible but sych thing like >>> >>> >>> {printf("ONE"), printf("TWO"), printf("THREE")} [2] >>> >>> shouldn evaluate al just the one is selected >>> like in array tab[23] not eveluates something other than tab[23] >> >> It's a 'compound literal'. It allows you to have the same {...} >> initialisation data format, but anywhere, not just for initialing. >> However it always needs a cast: >> >> (int[]){printf("ONE"), printf("TWO"), printf("THREE")}[2]; >> >> This prints ONETWOTHREE, it also then indexes the 3rd value of the >> array, which is 5, as returned by printf, so this: >> >> printf("%d\n", (int[]){printf("ONE"), printf("TWO"), >> printf("THREE")}[2]); >> >> prints ONETWOTHREE5 >> >> > > What you have written here is all correct, but a more common method > would be to avoid having three printf's : > > void shout_a_number(int n) { > printf( (const char* []) { "ONE", "TWO", "THREE" } [n] ); > } > > That's more likely to match what people would want. I was also trying to show that all elements are evaluated, so each has to have some side-effect to illustrate that. A true N-way-select construct (C only really has ?:) would evaluate only one, and would deal with an out-of-range condition. (In my implementations, a default/else branch value must be provided if the whole thing is expected to return a value.)