C/C++ language proposal: Change the 'case expression' from "integral constant-expression" to "integral expression"

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Adem

    C/C++ language proposal: Change the 'case expression' from "integral constant-expression" to "integral expression"

    C/C++ language proposal:
    Change the 'case expression' from "integral constant-expression" to "integral expression"

    The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
    says under 6.4.2(2) [see also 5.19]:

    case constant-expression :

    I propose that the case expression of the switch statement
    be changed from "integral constant-expression" to "integral expression".
    This opens up many new possibilities since then also function calls
    would be permitted in the case expression.
    The old case case would continue to function since
    it is a subset of the new case case.

    Example usage:

    //...
    int f()
    {
    //...
    return BLA1;
    }

    int g()
    {
    //...
    return BLA2;
    }

    int h()
    {
    //...
    return BLA3;
    }

    int y, x = f();
    switch (x)
    {
    case 123 : y = g(); break;
    case g() : y = 456; break; // using new case feature, ie. func-call
    case h() : y = 789; break; // ditto
    default : y = -1; break;
    }

  • Lew Pitcher

    #2
    Re: C/C++ language proposal: Change the 'case expression' from "integr al constant-expression&quot ; to "integr al expression&quot ;

    On October 23, 2008 14:17, in comp.lang.c, Adem (for-usenet-5c@alicewho.com )
    wrote:
    C/C++ language proposal:
    Change the 'case expression' from "integral constant-expression" to
    "integral expression"
    >
    The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
    says under 6.4.2(2) [see also 5.19]:
    [snip]

    Sorry, but your proposal is off-topic for the comp.lang.c newsgroup. I
    suspect that it is also off-topic for comp.lang.c++.

    As C and C++ are two separate languages, each defined by their own
    standards, I suggest that you break your "C/C++" proposal into a "C
    proposal" and a separate "C++ proposal", and submit each to their
    respective standards bodies.

    For C, you /might/ post your proposal to the comp.std.c newsgroup, as that
    is the group that discusses the ramifications of and enhancements to the C
    language standard.

    --
    Lew Pitcher

    Master Codewright & JOAT-in-training | Registered Linux User #112576
    http://pitcher.digitalfreehold.ca/ | GPG public key available by request
    ---------- Slackware - Because I know what I'm doing. ------


    Comment

    • Eric Sosman

      #3
      Re: C/C++ language proposal: Change the 'case expression' from "integralc onstant-expression&quot ; to "integr al expression&quot ;

      Adem wrote:
      C/C++ language proposal:
      Change the 'case expression' from "integral constant-expression" to "integral expression"
      >
      The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
      says under 6.4.2(2) [see also 5.19]:
      >
      case constant-expression :
      >
      I propose that the case expression of the switch statement
      be changed from "integral constant-expression" to "integral expression".
      switch (rand()) {
      case rand(): puts ("What's"); break;
      case rand(): puts ("wrong"); break;
      case rand(): puts ("with"); break;
      case rand(): puts ("this"); break;
      case rand(): puts ("picture?") ; break;
      }

      --
      Eric.Sosman@sun .com

      Comment

      • Keith Thompson

        #4
        Re: C/C++ language proposal: Change the 'case expression' from "integr al constant-expression&quot ; to "integr al expression&quot ;

        Eric Sosman <Eric.Sosman@su n.comwrites:
        Adem wrote:
        >C/C++ language proposal: Change the 'case expression' from
        >"integral constant-expression" to "integral expression"
        >The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
        >says under 6.4.2(2) [see also 5.19]:
        > case constant-expression : I propose that the case expression
        >of the switch statement
        >be changed from "integral constant-expression" to "integral expression".
        >
        switch (rand()) {
        case rand(): puts ("What's"); break;
        case rand(): puts ("wrong"); break;
        case rand(): puts ("with"); break;
        case rand(): puts ("this"); break;
        case rand(): puts ("picture?") ; break;
        }
        Well, it *could* be defined to be equivalent to the following:

        {
        const int __tmp = rand();
        if (__tmp == rand() puts("What's");
        else if (__tmp == rand() puts("wrong");
        else if (__tmp == rand() puts("with");
        else if (__tmp == rand() puts("this");
        else if (__tmp == rand() puts("picture?" );
        }

        That's intended to be equivalent code just for this example, not a
        definition; other transformations would be required when one case
        falls through to the next. And I refuse to think about how this would
        affect Duff's Device.

        The point of C's switch statement is that it can be implemented
        efficiently as a jump table, in contrast to an if/else chain where the
        conditions have to be evaluated sequentially.

        If you want to do something like a switch statement, but where the
        case values aren't constant, you can always just write an if/else
        chain. If you want to support this kind of thing in the language, so
        that you only have to specify the LHS of the comparison once, I think
        I'd prefer to introduce a new construct rather than adding this
        functionality to the existing switch/case construct. With this
        proposal, changing a single expression from a constant to a
        non-constant could have substantial effects on the generated code, and
        depending on how it's defined, subtle effects on the code's behavior.

        --
        Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
        Nokia
        "We must do something. This is something. Therefore, we must do this."
        -- Antony Jay and Jonathan Lynn, "Yes Minister"

        Comment

        • CBFalconer

          #5
          Re: C/C++ language proposal: Change the 'case expression' from &quot;integralc onstant-expression&quot ; to &quot;integr al expression&quot ;

          Lew Pitcher wrote:
          Adem (for-usenet-5c@alicewho.com ) wrote:
          >
          >C/C++ language proposal:
          >Change the 'case expression' from "integral constant-expression"
          >to "integral expression"
          >>
          >The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
          >says under 6.4.2(2) [see also 5.19]:
          >
          [snip]
          >
          Sorry, but your proposal is off-topic for the comp.lang.c
          newsgroup. I suspect that it is also off-topic for comp.lang.c++.
          >
          As C and C++ are two separate languages, each defined by their
          own standards, I suggest that you break your "C/C++" proposal
          into a "C proposal" and a separate "C++ proposal", and submit
          each to their respective standards bodies.
          >
          For C, you /might/ post your proposal to the comp.std.c newsgroup,
          as that is the group that discusses the ramifications of and
          enhancements to the C language standard.
          In addition, it is a BAD IDEA. Eliminating the constant provision
          prevents making efficient transfer tables. It even prevents
          discovering that such tables are feasible (or not).

          --
          [mail]: Chuck F (cbfalconer at maineline dot net)
          [page]: <http://cbfalconer.home .att.net>
          Try the download section.

          Comment

          • blargg

            #6
            Re: C/C++ language proposal: Change the 'case expression' from &quot;integr al constant-expression&quot ; to &quot;integr al expression&quot ;

            In article <4900ECB2.94DA1 4F@yahoo.com>, cbfalconer@main eline.net wrote:
            Lew Pitcher wrote:
            Adem (for-usenet-5c@alicewho.com ) wrote:
            C/C++ language proposal:
            Change the 'case expression' from "integral constant-expression"
            to "integral expression"
            [...]
            In addition, it is a BAD IDEA. Eliminating the constant provision
            prevents making efficient transfer tables. It even prevents
            discovering that such tables are feasible (or not).
            It doesn't eliminate the privision, it just makes it more difficult. In
            effect, optimizing

            switch ( f() )
            {
            case 1: { /* A */ } break;
            case 2: { /* B */ } break;
            case 3: { /* C */ } break;
            case 4: { /* D */ } break;
            }

            becomes similar optimizing

            int const x = f();
            if ( x == 1 ) { /* A */ }
            else if ( x == 2 ) { /* B */ }
            else if ( x == 3 ) { /* C */ }
            else if ( x == 4 ) { /* D */ }

            since both involve an unchanging value and constant values being compared
            to. A compiler could convert both into a jump table or binary search.

            Comment

            • lovecreatesbeauty@gmail.c0m

              #7
              Re: C/C++ language proposal: Change the 'case expression' from&quot;integ ral constant-expression&quot ; to &quot;integr al expression&quot ;

              On Oct 24, 3:12 am, Keith Thompson <ks...@mib.orgw rote:
              Eric Sosman <Eric.Sos...@su n.comwrites:
              Adem wrote:
              C/C++ language proposal: Change the 'case expression' from
              "integral constant-expression" to "integral expression"
              The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
              says under 6.4.2(2) [see also 5.19]:
              case constant-expression : I propose that the case expression
              of the switch statement
              be changed from "integral constant-expression" to "integral expression".
              >
              switch (rand()) {
              case rand(): puts ("What's"); break;
              case rand(): puts ("wrong"); break;
              case rand(): puts ("with"); break;
              case rand(): puts ("this"); break;
              case rand(): puts ("picture?") ; break;
              }
              Wonderful!
              >
              Well, it *could* be defined to be equivalent to the following:
              >
              {
              const int __tmp = rand();
              if (__tmp == rand() puts("What's");
              else if (__tmp == rand() puts("wrong");
              else if (__tmp == rand() puts("with");
              else if (__tmp == rand() puts("this");
              else if (__tmp == rand() puts("picture?" );
              >
              }
              >
              If rand() generates equal random numbers frequently, is it meaningful?

              Comment

              • James Kuyper

                #8
                Re: C/C++ language proposal: Change the 'case expression' from &quot;integralc onstant-expression&quot ; to &quot;integr al expression&quot ;

                lovecreatesbeau ty@gmail.c0m wrote:
                On Oct 24, 3:12 am, Keith Thompson <ks...@mib.orgw rote:
                ....
                >Well, it *could* be defined to be equivalent to the following:
                >>
                >{
                > const int __tmp = rand();
                > if (__tmp == rand() puts("What's");
                > else if (__tmp == rand() puts("wrong");
                > else if (__tmp == rand() puts("with");
                > else if (__tmp == rand() puts("this");
                > else if (__tmp == rand() puts("picture?" );
                >>
                >}
                >>
                >
                If rand() generates equal random numbers frequently, is it meaningful?
                That code neither makes nor implies any assumptions about how frequently
                rand() generates random numbers.

                Comment

                • Bartc

                  #9
                  Re: C/C++ language proposal: Change the 'case expression' from &quot;integr al constant-expression&quot ; to &quot;integr al expression&quot ;


                  "Eric Sosman" <Eric.Sosman@su n.comwrote in message
                  news:1224788466 .760836@news1nw k...
                  Adem wrote:
                  >C/C++ language proposal: Change the 'case expression' from "integral
                  >constant-expression" to "integral expression"
                  >>
                  >The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
                  >says under 6.4.2(2) [see also 5.19]:
                  >>
                  > case constant-expression : I propose that the case expression of
                  >the switch statement
                  >be changed from "integral constant-expression" to "integral expression".
                  >
                  switch (rand()) {
                  case rand(): puts ("What's"); break;
                  case rand(): puts ("wrong"); break;
                  case rand(): puts ("with"); break;
                  case rand(): puts ("this"); break;
                  case rand(): puts ("picture?") ; break;
                  }
                  What's wrong with it that you're just injecting garbage. You can use the
                  same rand() trick with any statement:

                  for (i=rand(); i<=rand(); i=rand())...

                  But there's nothing really wrong with the OP's proposal, except it should be
                  a new statement type to keep the switch semantics clean. Then, it could also
                  use non-integer types.

                  C likes it's rather austere syntax however so I doubt this change will ever
                  be made.

                  --
                  Bartc

                  Comment

                  • anon

                    #10
                    Re: C/C++ language proposal: Change the 'case expression' from &quot;integralc onstant-expression&quot ; to &quot;integr al expression&quot ;

                    Bartc wrote:
                    >
                    "Eric Sosman" <Eric.Sosman@su n.comwrote in message
                    news:1224788466 .760836@news1nw k...
                    >Adem wrote:
                    >>C/C++ language proposal: Change the 'case expression' from "integral
                    >>constant-expression" to "integral expression"
                    >>>
                    >>The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
                    >>says under 6.4.2(2) [see also 5.19]:
                    >>>
                    >> case constant-expression : I propose that the case expression
                    >>of the switch statement
                    >>be changed from "integral constant-expression" to "integral expression".
                    >>
                    >switch (rand()) {
                    >case rand(): puts ("What's"); break;
                    >case rand(): puts ("wrong"); break;
                    >case rand(): puts ("with"); break;
                    >case rand(): puts ("this"); break;
                    >case rand(): puts ("picture?") ; break;
                    >}
                    >
                    What's wrong with it that you're just injecting garbage. You can use the
                    same rand() trick with any statement:
                    >
                    for (i=rand(); i<=rand(); i=rand())...
                    >
                    But there's nothing really wrong with the OP's proposal, except it
                    should be a new statement type to keep the switch semantics clean. Then,
                    it could also use non-integer types.
                    There is something wrong. Try to compile this example, and I hope you
                    figure whats wrong with his proposal :

                    int main()
                    {
                    int a = 3;
                    switch( a )
                    {
                    case 3:
                    a = 1;
                    break;
                    case 3:
                    a = 2;
                    break;
                    case 3:
                    a = 3;
                    break;
                    default:
                    a = 4;
                    }
                    }

                    Comment

                    • Bartc

                      #11
                      Re: C/C++ language proposal: Change the 'case expression' from &quot;integr al constant-expression&quot ; to &quot;integr al expression&quot ;


                      "anon" <anon@no.invali dwrote in message
                      news:gdsjtj$1e4 $1@news01.versa tel.de...
                      Bartc wrote:
                      >>
                      >"Eric Sosman" <Eric.Sosman@su n.comwrote in message
                      >news:122478846 6.760836@news1n wk...
                      >>Adem wrote:
                      >>>C/C++ language proposal: Change the 'case expression' from "integral
                      >>>constant-expression" to "integral expression"
                      >But there's nothing really wrong with the OP's proposal, except it should
                      >be a new statement type to keep the switch semantics clean. Then, it
                      >could also use non-integer types.
                      >
                      There is something wrong. Try to compile this example, and I hope you
                      figure whats wrong with his proposal :
                      >
                      int main()
                      {
                      int a = 3;
                      switch( a )
                      {
                      case 3:
                      a = 1;
                      break;
                      case 3:
                      a = 2;
                      break;
                      case 3:
                      a = 3;
                      break;
                      default:
                      a = 4;
                      }
                      }
                      The OP was talking about /expressions/ for case values. But because normal
                      switch likes it's values to be unique, I suggested a different statement.
                      This way duplicate case values can still be picked up instead of being
                      quietly converted to the new semantics:

                      a=x=y=z=3;

                      newswitch (a)
                      {
                      case x: ...
                      case y: ...
                      case z: ...
                      ...
                      This would just select the first matching expression. No different from a
                      series of if/else statements as already noted, but more eloquent.

                      --
                      Bartc

                      Comment

                      • Bo Persson

                        #12
                        Re: C/C++ language proposal: Change the 'case expression' from &quot;integr al constant-expression&quot ; to &quot;integr al expression&quot ;

                        Bartc wrote:
                        "anon" <anon@no.invali dwrote in message
                        news:gdsjtj$1e4 $1@news01.versa tel.de...
                        >Bartc wrote:
                        >>>
                        >>"Eric Sosman" <Eric.Sosman@su n.comwrote in message
                        >>news:12247884 66.760836@news1 nwk...
                        >>>Adem wrote:
                        >>>>C/C++ language proposal: Change the 'case expression' from
                        >>>>"integral constant-expression" to "integral expression"
                        >
                        >>But there's nothing really wrong with the OP's proposal, except
                        >>it should be a new statement type to keep the switch semantics
                        >>clean. Then, it could also use non-integer types.
                        >>
                        >There is something wrong. Try to compile this example, and I hope
                        >you figure whats wrong with his proposal :
                        >>
                        >int main()
                        >{
                        > int a = 3;
                        > switch( a )
                        > {
                        > case 3:
                        > a = 1;
                        > break;
                        > case 3:
                        > a = 2;
                        > break;
                        > case 3:
                        > a = 3;
                        > break;
                        > default:
                        > a = 4;
                        > }
                        >}
                        >
                        The OP was talking about /expressions/ for case values. But because
                        normal switch likes it's values to be unique, I suggested a
                        different statement. This way duplicate case values can still be
                        picked up instead of being quietly converted to the new semantics:
                        >
                        a=x=y=z=3;
                        >
                        newswitch (a)
                        {
                        case x: ...
                        case y: ...
                        case z: ...
                        ...
                        This would just select the first matching expression. No different
                        from a series of if/else statements as already noted, but more
                        eloquent.
                        Yes, it would work, just as it does for COBOL's EVALUATE statement - a
                        multiway if-statement




                        Wanna be more like COBOL? :-)


                        Bo Persson


                        Comment

                        • lovecreatesbeauty@gmail.c0m

                          #13
                          Re: C/C++ language proposal: Change the 'case expression' from&quot;integ ral constant-expression&quot ; to &quot;integr al expression&quot ;

                          On Oct 24, 7:59 pm, "Bartc" <b...@freeuk.co mwrote:
                          "Eric Sosman" <Eric.Sos...@su n.comwrote in message
                          Adem wrote:
                          The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
                          says under 6.4.2(2) [see also 5.19]:
                          case constant-expression : I propose that the case expression of
                          the switch statement
                          be changed from "integral constant-expression" to "integral expression".
                          switch (rand()) {
                          case rand(): puts ("What's"); break;
                          case rand(): puts ("wrong"); break;
                          case rand(): puts ("with"); break;
                          case rand(): puts ("this"); break;
                          case rand(): puts ("picture?") ; break;
                          }
                          What's wrong with it that you're just injecting garbage. You can use the
                          same rand() trick with any statement:
                          >
                          for (i=rand(); i<=rand(); i=rand())...
                          The statements following each case lable in a switch are intended to
                          be diffrent, while the body of for statement is the same for each
                          loop. Eric's trick illustrates that how bad an idean could that
                          proposal be.

                          Comment

                          • Keith Thompson

                            #14
                            Re: C/C++ language proposal: Change the 'case expression' from &quot;integr al constant-expression&quot ; to &quot;integr al expression&quot ;

                            "lovecreatesbea uty@gmail.c0m" <lovecreatesbea uty@gmail.comwr ites:
                            On Oct 24, 7:59 pm, "Bartc" <b...@freeuk.co mwrote:
                            >"Eric Sosman" <Eric.Sos...@su n.comwrote in message
                            Adem wrote:
                            >The C++ Standard (ISO/IEC 14882, Second edition, 2003-10-15)
                            >says under 6.4.2(2) [see also 5.19]:
                            > case constant-expression : I propose that the case expression of
                            >the switch statement
                            >be changed from "integral constant-expression" to "integral expression".
                            switch (rand()) {
                            case rand(): puts ("What's"); break;
                            case rand(): puts ("wrong"); break;
                            case rand(): puts ("with"); break;
                            case rand(): puts ("this"); break;
                            case rand(): puts ("picture?") ; break;
                            }
                            >What's wrong with it that you're just injecting garbage. You can use the
                            >same rand() trick with any statement:
                            >>
                            >for (i=rand(); i<=rand(); i=rand())...
                            >
                            The statements following each case lable in a switch are intended to
                            be diffrent, while the body of for statement is the same for each
                            loop. Eric's trick illustrates that how bad an idean could that
                            proposal be.
                            The expressions (not statements) are intended (required, in fact) to
                            be integer constant expressions. The proposal is to change that
                            requirement. It's moderately obvious that the requirement that no two
                            of the case expressions would also have to be relaxed, since it's not
                            possible in general to determine at compilation time whether two
                            non-constant expressions have the same value.

                            Defining consistent semantics for a modified switch statement is not
                            all that difficult. Presumably existing switch statements would have
                            to behave as they do now. Beyond that, there are several possible
                            ways to define the semantics and constraints for switch statements
                            that are currently invalid.

                            Eric's example demonstrates the need to define the semantics of this
                            proposed new feature. I don't think it demonstrates, by itself, that
                            it's a bad idea. If non-constant switch expressions were allowed, it
                            would be possible to write perfectly sensible code using the new
                            feature. It would also, as Eric demonstrated, be possible to write
                            very silly code using the new feature -- or using any of the
                            language's existing features.

                            I do agree that the proposed feature is a bad idea, but not because of
                            Eric's example. I think it's a bad idea because it would have to
                            define new semantics for an existing construct. Currently, if you
                            accidentally use a non-constant case expression, the compiler will
                            diagnose it as an error (and probably reject your program). Under the
                            proposal, the code would be valid, and would likely behave in a subtly
                            wrong manner and/or with poor performance. Evaluating the switch
                            expression and branching to the right case label is typically an O(1)
                            operation, if the compiler is able to generate a jump table. Add a
                            single non-constant expression, and it becomes O(N), where N is the
                            number of cases.

                            I wouldn't object as strongly to a new feature, with a distinct
                            syntax, that implements the proposed functionality, but I'd still
                            oppose it -- not because it's an inherently bad idea, but because the
                            benefit is IMHO outweighed by the cost of adding a new feature to the
                            language. There's nothing you could do with the proposed new feature
                            that you can't already do fairly straightforward ly using existing
                            features, namely an if/else chain and, if the switch expression is
                            complicated or has side effects, a temporary variable.

                            --
                            Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
                            Nokia
                            "We must do something. This is something. Therefore, we must do this."
                            -- Antony Jay and Jonathan Lynn, "Yes Minister"

                            Comment

                            • CBFalconer

                              #15
                              Re: C/C++ language proposal: Change the 'case expression' from&quot;integ ralconstant-expression&quot ; to &quot;integr al expression&quot ;

                              anon wrote:
                              >
                              .... snip ...
                              >
                              There is something wrong. Try to compile this example, and I hope
                              you figure whats wrong with his proposal :
                              >
                              int main()
                              {
                              int a = 3;
                              switch( a )
                              {
                              case 3:
                              a = 1;
                              break;
                              case 3:
                              a = 2;
                              break;
                              case 3:
                              a = 3;
                              break;
                              default:
                              a = 4;
                              }
                              }
                              Your code works better if it is made legal:

                              int main(void) {
                              int a = 3;

                              switch( a ) {
                              case 3: a = 1;
                              break;
                              case 2: a = 2;
                              break;
                              case 1: a = 3;
                              break;
                              default: a = 4;
                              }
                              return 0;
                              }

                              Also, cross posting to c.l.c++ is not cool.


                              --
                              [mail]: Chuck F (cbfalconer at maineline dot net)
                              [page]: <http://cbfalconer.home .att.net>
                              Try the download section.

                              Comment

                              Working...