\documentclass[a4paper,12pt]{article} \usepackage[utf8]{inputenc} \usepackage[UTF8]{ctexcap} \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amssymb} \usepackage{xcolor} %opening \title{C++学习笔记} \author{行走的芦苇} \begin{document} \maketitle %\begin{abstract} %\end{abstract} \section{基本概念} 在协作完成一个大的软件时,应如何合理地设计程序结构,并保证每一个子程序之间都能正确地共享和交换数据,这是编程的\textcolor{red}{核心问题}。 程序员的任务是将计算表达出来,并且做到: \begin{itemize} \item 正确 \item 简单 \item 高效 \end{itemize} 一个看似矛盾的事实:关注代码结构和代码“质量”是程序取得成功的最快捷径。\\ 程序的组织体现了程序员的编程思路、目前手段主要是把大的计算任务划分为许多小任务,这一技术主要包括两类方法。 \begin{itemize} \item[抽象]:即不需要了解的程序具体实现细节被隐藏在相应的接口后边 \item[分治]:把一个大问题分为几个小问题分别解决 \end{itemize} 对于一个好的程序员和系统设计师,软件的\textbf{结构问题}是在开发过程中始终要关注的最重要问题。 将问题不断的分解、细化,直到问题小到能够被我们很好的理解和解决为止\\ 表达式是程序的最小组成单元,表达式就是从一些操作数计算一个值。\\ 左值:一个变量;右值,一个变量的值\\ 符号常量表示那些在初始化后值不再改变的数值量。\\ 表达式语句主要包括赋值语句、I/O语句和函数调用。声明语句呢?? 除了合法输入情况以外,程序必须经过各种非法输入的检验。\\ switch语句括号中值必须是整型、字符型或枚举类型。特别的,不能使用字符串型\\ \begin{verbatim} char* ca = reinterpret_cast(&a); \end{verbatim} 判定一个自然数是质量的方法: 对于任一自然数$N$,$0 =3$ \item[判定]对于$\forall M~~2(x)| 当一个函数被调用时,编译器分配一个数据结构,保存所有参数和局部变量的拷贝,这样的数据结构称为函数活动记录(function activation record),每个函数的活动记录都有自己特有的详细布局。 递归(recursive) 活动记录栈(stack of activation record);调用栈(call stack) 一个constexpr函数和普通函数行为相同,但若在需要一个常量的位置处使用它,则有所不同,此时若传递的参数是常量表达式,则计算在编译时完成。为使该机制可行,要求constexpr函数必须非常简单。在C++11中,函数体只有包含一条return 语句;在C++14中,还可以写简单的循环语句。 一段代码中,创建变量的顺序与销毁的顺序相反。 \textcolor{red}{\verb|v[++i]=i|}是有很大的问题:不同的编译器不一定给出警告,不同的优化方法产生的结果可能不同,不能保证赋值符左边的子表达式一定先于右边的计算。 \begin{verbatim} //file1 int x1 = 1; int y1 = x1+2 //file2 extern int y1; int y2 = y1 + 2; \end{verbatim} 这段代码的问题是:使用了全局变量;全局变量名字太短;全局变量使用了复杂的初始化。\par \begin{verbatim} const Data& default_date() { static const Deat dd(1970,1,2); } \end{verbatim} 一个静态的局部变量只在首次调用时才被初始化;使用引用,消除了不必要的对象拷贝;使用常量引用,可以防止调用者无意中改变对象的值。 \section{编码错误} \begin{verbatim} double my_abs(int x) { if (x < 0) return -x; else if (x > 0) return x; } \end{verbatim} 这种情况下,当$x=0$会返回无效值 \end{document}