In the switch-case statements declaration-with-initialization is invalid but declaration-and-then-assignment is allowed. As shown in the following code snippet.
What is difference between these two type of initializations from the compiler side? And why is the first type of initialization invalid and second type a valid one.
switch(val)
{
case 0:
int newVal = 42; //Invalid
break;
case 1:
int newVal2; //Valid
newVal2 = 42;
break;
case 2:
break;
}
The variable can be declared, but it cannot be initialized.
Do not declare variables inside a switch statement before the first case label. According to the C Standard, 6.8.
A switch statement can only have one default clause.
Effectively, the rule is that you can't jump into a block past a declaration that has an initialization (or past the declaration of a non-POD type variable). The C++ standard says (C++03 §6.7):
It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps(77) from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer (8.5).
(*) The transfer from the condition of a
switch
statement to acase
label is considered a jump in this respect.
int newVal = 42;
is a declaration that has an initializer (the = 42
part). The program is ill-formed because if val
is 1
or 2
, you'll jump into the switch block past the initialization.
int newVal2;
is also a declaration; because int
is a POD type and the declaration has no initializer, you can jump past this declaration.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With