C++ Primer笔记(五)语句

来源:互联网 发布:apache源码包下载 编辑:程序博客网 时间:2024/05/21 02:50

1、没有涉及到初始化和构造函数调用的声明并不是执行语句。

if选择语句、if...else双路选择语句、C++编译器总是把else同它之前最近的if联系起来。(最近原则)

double比float更受欢迎。

条件运算符(?:):条件表达式的值也可以是要执行的动作。


2、static_cast<double>(total)强制类型转换:并不改变原数据,只是生成它的副本。

浮点值是近似的。一般字符都是存储在char类型的变量中。

cin.get()从键盘读入一个字符,可以把它保存在变量中。

EOF:文件结束,一般取值为-1作为标记值。

最好在switch中提供default情况,每个case都可以有多条语句,在一个case句子末尾的break语句使程序控制马上退出switch语句。


3、逻辑运算符:&&与 ||或 !非 == 左值还可以用做右值,但反过来不成立。

标准库函数power(w,y)计算x的y次幂。

如果逻辑运算符用作条件,那么任何非零的值的默认含义是true,零值的默认含义是false。


4、switch中只有在最后一个case或是default语句之后才能定义变量,这样规定是为了避免代码跳过变量定义和初始化。
如switch(val)
{
    case xx:
         break;
    case yy:
         int i;//错误,该变量会在块结束之前一直存在,此后的case              
                       //和default都可以使用i;如果语句跳过yy执行后面
                       //的语句则i就出现未定义就使用的情况。
         break;
    case zz:
         i++;   
         break;  
    default:
          i--;
          break;
}
为了解决这种情况,可以为每个case语句添加{}花括号,引入块语句,在该块定义的变量只能在该语句块中使用。

5、do
{
    cal(foo);
}while(int foo==val());此句是错误的。

也不可以以下情况:

do

{
     int foo=90;   //跳出{}后foo就不复存在了
}while(foo==val)


6、异常机制提供程序的错误检测与错误处理部分之间的通信。有标准库定义的一组异常类用来在throw和catch之间传递有关的错误信息。
try引入局部作用域,在{ }定义的变量不能在try块外引用。


7、要让程序所包含的代码仅在开发过程中执行,当程序完成准备交付就会将调试代码关闭。
这可以使用_DEBUG和NDEBUG预处理变量来实现。

NDEBUG是在ANSI C中定义的。
int main(int argc,char**argv)
{
  # ifndef  NDEBUG
    cerr<<"starting main"<<endl;
   #endif
}
如果NDEBUG未定义程序就会将错误信息写到cerro中,如果NDEBUG已定义,程序运行时将会跳过#ifndef和#endif。


8、默认情况下NDEBUG未定义,也就意味着#ifndef,#endif之间的代码必须执行。

如果NDEBUG未定义assert断言就会被执行。如定义NDEBUG,assert将不被执行。


9、这里要将NDEBUG与vc中的_DEBUG区别开。

VC定义_DEBUG有其用途, 它控制其它宏比如 _ASSERT的行为, 但与assert 无关。

assert是ANSI C标准的断言宏,_ASSERT是VC提供的众多断言相关的宏中的一个。

虽然做Windows下开发的会注意到VC编译选项Release版都有一个NDEBUG宏, 但这个宏的引入不是微软特定的。而是在ANSI C中定义的。在vs中使用debug模式,默认情况下将定义_DEBUG。使用release模式,默认情况下将定义NDEBUG。


10、标准ANSI C还定义了其余4个在调试中非常有用的常量, 这些常量在debug和release模式下均可使用。
1)__FILE___文件名
2)__LINE__行号
3)__TIME__文件被编译时间。
4)__DATE__文件被编译的日期。

assert是在casset头文件定义的,它有点像函数调用,需要一个表达式作为它的条件,如assert(i>j),如果i>j为真,则不做任何操作,若i>j为假,assert输出信息并且终止程序的执行。在vs中微软定义了_ASSERT断言功能与assert相同。


0 0
原创粉丝点击