0x00001f6f
0x00001f72
0x00001f73
0x00001f10
0x00001f11
0x00001f13
0x00001f16
0x00001f19
0x00001f1c
0x00001f23
0x00001f26
0x00001f29
0x00001f30
0x00001f32
0x00001f34
0x00001f36
0x00001f38
0x00001f3e
0x00001f41
0x00001f44
0x00001f48
0x00001f4d
0x00001f50
0x00001f52
0x00001f58
0x00001f5b
0x00001f5e
0x00001f62
0x00001f67
0x00001f6a
0x00001f6f
0x00001f72
0x00001f73
注意main+36和main + 38位置的汇编,两条跳转语句会直接找到标号,忽略了前面的代码。
如果把源代码改为如下,依然不能输出3:
[cpp]
int main(int argc, char **argv)
{
int a = 2;
switch(a)
{
int b = 2;
case 1:
PRINT_D(b)
break;
b = 3;
case 2:
PRINT_D(b)
break;
default:
PRINT_D(b)
break;
}
return 0;
}
int main(int argc, char **argv)
{
int a = 2;
switch(a)
{
int b = 2;
case 1:
PRINT_D(b)
break;
b = 3;
case 2:
PRINT_D(b)
break;
default:
PRINT_D(b)
break;
}
return 0;
}
Q4: sizeof运算符里面跟着i++,为什么i没有自增?
[cpp]
#include
#define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue));
int main(int argc, char **argv)
{
int i = 1;
PRINT_D(sizeof(i++))
PRINT_D(i)
return 0;
}
#include
#define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue));
int main(int argc, char **argv)
{
int i = 1;
PRINT_D(sizeof(i++))
PRINT_D(i)
return 0;
}
A: 原因在于sizeof在编译期间自动计算出来它的数值,对于i++, 编译器仅仅看到了它的类型,却没有计算它的数值。看看汇编:
[cpp]
0x00001ef0
0x00001ef1
0x00001ef3
0x00001ef4
0x00001ef5
0x00001ef6
0x00001ef9
0x00001efc
0x00001eff
0x00001f04
0x00001f0a
0x00001f10
0x00001f15
0x00001f1c
0x00001f1f
0x00001f22
0x00001f29
0x00001f2c
0x00001f34
0x00001f37
0x00001f3a
0x00001f3d
0x00001f42
0x00001f45
0x00001f48
0x00001f4b
0x00001f4f
0x00001f52
0x00001f57
0x00001f5a
0x00001f5d
0x00001f5f