b *= a; // 则其地址为3009,假设长度为6字节
goto P2;
上面的P1和P2就是标号,其值分别为3005和3009,而最后的goto就是跳转语句,其格式为goto <标号>;。此语句非常简单,先通过“:”定义了一个标号,然后在编写goto时使用不同的标号就能跳到不同的位置。
应该注意上面故意让P1和P2定义时独占一行,其实也可以不用,即:
long a = 1;
P1: a += 1;
P2: b *= a;
goto P2;
因此看起来“P1:”和“P2:”好象是单独的一条定义语句,应该注意,准确地说它们应该是语句修饰符,作用是定义标号,并不是语句,即这样是错误的:
long a = 1;
P1: {
a += 1;
P2: b *= a;
P3:
} goto P2;
上面的P3:将报错,因为其没有修饰任何语句。还应注意其中的P1仍然是3005,即“{}”仅仅只是其复合的作用,实际并不产生代码进而不影响语句的地址。
if else 前面说过了,为了实现“什么样的情况”做“什么样的动作”,故C++非常正常地提供了条件判断语句以实现条件的不同而执行不同的代码。if else的格式为:
if(<数字>)<语句1>else<语句2> 或者 if(<数字>)<语句1>
long a = 0, b = 1;
P1:
a++;
b *= a;
if( a < 10 )
goto P1;
long c = b;
上面的代码就表示只有当a的值小于10时,才跳转到P1以重复执行,最后的效果就是c的值为10的阶乘。
上面的<数字>表示可以在“if”后的括号中放一数字,即表达式,而当此数字的值非零时,即逻辑真,程序跳转以执行<语句1>,如果为零,即逻辑假,则执行<语句2>。即也可如此:if( a – 10 ) goto P1;,其表示当a – 10不为零时才执行goto P1;。这和前面的效果一样,虽然最后c仍然是10的阶乘,但意义不同,代码的可读性下降,除非出于效率的考虑,不推荐如此书写代码。
而<语句1>和<语句2>由于是语句,也就可以放任何是语句的东西,因此也可以这样:
if( a ) long c;
上面可谓吃饱了撑了,在此只是为了说明<语句1>实际可以放任何是语句的东西,但由于前面已经说过,标号的