#include<stdio.h>
int main() {
int a = 1;
switch (a) {
int b = 20;
case 1:
{
printf("b is %d\n", b);
break;
}
default:
{
printf("b is %d\n", b);
break;
}
}
return 0;
}
views:
347answers:
9Because the switch statement jumps to a relevant case, so the line int b = 20
will never be executed.
The line
int b=20;
Is not executed before the switch is entered. You would have to move it above the switch statement to get 20 output.
Your compiler should warn you about this. The initialization of 'b' is at the beginning of the switch statement, where it will never be executed -- execution will always flow directly from the switch statement header to the matching case label.
It doesn't output "b = 20" because b is set inside the switch statement and this instruction is never executed. What you want is this:
int b = 20;
switch (a) {
case 1:
{
printf("b is %d\n", b);
break;
}
default:
{
printf("b is %d\n", b);
break;
}
}
Gcc throws a warning saying that b is uninitialized when you call the printf()
you have to move "int b = 20" before the switch()
Inside of a switch is a hidden goto
statement. So basically what is happening is really
int a=1;
if(a==1){ //case 1
goto case1;
}else{ //default
goto default;
}
int b=20;
case1:....
Remember that case
labels in switch
statement are called "labels" for a reason: they are pretty much ordinary labels, just like the ones you can goto
to. This is actually how switch
works: it is just a structured version of goto
that just jumps from switch
to the appropriate label and continues execution from there. In your code you always jump over initialization of b
. So, b
never gets initialized.
The code
int b = 20
is actually doing two things:
int b
and
b = 20
The compiler sets up a variable called b when it compiles the program. This is an automatic
variable, which goes on the stack. But it does not assign it a value until the program execution reaches that point.
Before that point, it is unknown what value the variable has.
This would not be true for a global variable, or a static
variable -- those are initialized when the program begins running.
Compiling with gcc (Using cygwin on Windows) gives a warning message -
warning: unreachable code at beginning of switch statement
and the output is undefined or garbage which clearly says that initialization portion of b is never executed and hence the undefined value.
Note: Question can be raised that if the code or line is unreachable, then why does not we get the error: 'b' undeclared.
The compiler checks for the syntax of the program (above checks if b is declared) and finds it correct (b is declared), although semantically/logically it is incorrect.
Probably in future the compilers may become even more smarter and will be able to detect these kind of errors