- 在条件表达式中定义的变量必须初始化,该条件检验的就是初始化对象的值。
- 对于 switch 结构,只能在它的最后一个 case 标号或 default 标号(只有当default是最后一个标号时)后面定义变量。
- 在循环条件中定义的变量在每次循环里都要经历创建和撤销的过程。
- 形成标号的标识符只能用作 goto 的目标。因为这个原因,标号标识符可以与变量名以及程序里的其他标识符一样,不与别的标识符重名。goto 语句和获得所转移的控制权的带标号的语句必须位于于同一个函数内。
- goto 语句不能跨越变量的定义语句向前跳转:
如果确实需要在 goto 和其跳转对应的标号之间定义变量,则定义必须放在一个块语句中:// ... goto end; int ix = 10; // error: goto bypasses declaration statement end: // error: code here could use ix but the goto bypassed its declaration ix = 42;
向后跳过已经执行的变量定义语句则是合法的。为什么?向前跳过未执行的变量定义语句,意味着变量可能在没有定义的情况下使用。向后跳回到一个变量定义之前,则会使系统撤销这个变量,然后再重新创建它:// ... goto end; // ok: jumps to a point where ix is not defined { int ix = 10; // ... code using ix } end: // ix no longer visible here
注意:执行 goto 语句时,首先撤销变量 sz,然后程序的控制流程跳转到带 begin: 标号的语句继续执行,再次重新创建和初始化 sz 变量。// backward jump over declaration statement ok begin: int sz = get_size(); if (sz <= 0) { goto begin; }
- 只要 NDEBUG 未定义,assert 宏就求解条件表达式 expr,如果结果为 false,assert 输出信息并且终止程序的执行。如果该表达式有一个非零(例如,true)值,则 assert 不做任何操作。
- 预处理器还定义了其余四种在调试时非常有用的常量:
__FILE__ 文件名
__LINE__ 当前行号
__TIME__ 文件被编译的时间
__DATE__ 文件被编译的日期
转载于:https://www.cnblogs.com/cppfans/articles/2034522.html