Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #164632

Re: What's wrong with "char op[8]=(istest?"ef":"df");"

From Andrey Tarasevich <andreytarasevich@hotmail.com>
Newsgroups comp.lang.c
Subject Re: What's wrong with "char op[8]=(istest?"ef":"df");"
Date 2022-01-25 19:49 -0800
Organization A noiseless patient Spider
Message-ID <ssqgd4$3ab$1@dont-email.me> (permalink)
References <ssos8v$pq3$1@reader1.panix.com>

Show all headers | View raw


On 1/25/2022 5:00 AM, John Forkosh wrote:
> Minimal working (or should I say non-working example)...
> 
> #include <stdio.h>
> int main () {
>    int istest=1;
>    char op[8] = (istest?"ef":"df");
>    /*char op[8] = "ef";*/
>    printf("op=%s\n",op); }
> 
> for which cc emits the error...
> 
> test.c: In function 'main':
> test.c:4:16: error: invalid initializer
>      4 |   char op[8] = (istest?"ef":"df");
>        |                ^
> 
> But if I comment out that line and uncomment the one below it,
> then it compiles and runs fine. I've used this construction
> a million times without problems. But a-million-and-one seems
> to somehow be a problem. What's wrong???

Not sure about the intent of your question. Are you asking how it 
contradicts rules of the language? Or are you asking why the rules of 
the language are written that way?

The answer to the former is that each string literal ("ef" and "df") is 
an array. Arrays in C are affected by so called "array type decay": they 
turn into pointers, with the exception of several immediate contexts

   1. Operand of unary `&`
   2. Operand of `sizeof`
   3. Operand of `_Alignof`
   4. String literal initializer for a `char[]` array

This why your commented-out line compiles: it is excepted from the decay 
by point 4 and handled in a very special way, described in the standard.

Your original declaration is not excepted by any of these rules. So, 
your literals decay to pointers. And pointers cannot be used to 
initialize arrays. End of story.

As for why the language standard is written that way... Well, that's 
just the way it works in C.

-- 
Best regards,
Andrey Tarasevich

Back to comp.lang.c | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-25 13:00 +0000
  Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-25 13:09 +0000
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" Bart <bc@freeuk.com> - 2022-01-25 14:03 +0000
      Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-25 14:33 +0000
  Re: What's wrong with "char op[8]=(istest?"ef":"df");" Mateusz Viste <mateusz@xyz.invalid> - 2022-01-25 14:36 +0100
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-25 14:41 +0000
  Re: What's wrong with "char op[8]=(istest?"ef":"df");" Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-25 06:39 -0800
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-25 14:56 +0000
  Re: What's wrong with "char op[8]=(istest?"ef":"df");" James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-25 11:08 -0500
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-26 08:18 +0000
  Re: What's wrong with "char op[8]=(istest?"ef":"df");" Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-01-25 14:37 -0800
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-26 08:27 +0000
  Re: What's wrong with "char op[8]=(istest?"ef":"df");" Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-25 19:49 -0800
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2022-01-25 19:56 -0800
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-25 23:37 -0500
      Re: What's wrong with "char op[8]=(istest?"ef":"df");" Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-25 20:54 -0800
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-26 08:37 +0000
  Re: What's wrong with "char op[8]=(istest?"ef":"df");" Kaz Kylheku <480-992-1380@kylheku.com> - 2022-01-26 05:08 +0000
    Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-26 09:22 +0000
  Re: What's wrong with "char op[8]=(istest?"ef":"df");" John Forkosh <forkosh@panix.com> - 2022-01-26 09:24 +0000

csiph-web