从Hello world谈起

函数

  • 定义:可以被反复调用的代码,可以接受输入,
  • 结构

    • 返回类型:void(不需要返回值),函数体中返回的类型要和返回类型一致,非void,一定要有返回语句,main函数可以没有
    • 函数名:用于函数调用
    • 函数体:具体的执行逻辑
    • 形参列表:表示函数接受的参数类型。形参(下例中 const char* pInfo)与实参(下例中的“hello world”“hello china”)的概念
      • 空: void fun()
      • void: 同形参列表为空
      • 无形参:形参列表设计有误时,可以去掉形参,不改变原始调用方式void fun(const char* pInfo, int)
        1. void fun(const char* pInfo)
        2. {
        3. std::cout<pInfo<<std::endl;
        4. return
        5. }
        6. int main()
        7. {
        8. fun("hello world");
        9. fun("hello china");
        10. }

        main函数

        c++标准:
  • main函数返回类型只有int,用于表示程序执行状态,错误代码

  • 敏感大小写,不能使用Main
  • 形参列表只有两种形式,其他形式会报warning,形参名字可改变

    • int main()
    • int main(int argc, char* argv[])

      类型

      用途:描述参数信息,数据在内存中保存占用字节数

      语句:

  • 一条语句:表达式+分号

  • 语句块:{ }
  • if/while等语句

image.png

注释

  • 用途:会被编译器忽略的内容,用于编写说明or 去除不使用的语句
  • 块注释/**/:应用有意忽略的形参列表
  • 行注释//:

image.png

系统I/O

输出流的区别

  • 输出目标:cout/cerr/clog输出到显示器并无区别,可以输出到不同文件,cerr只输出错误信息(立即刷新缓冲区),clog表示不立即刷新缓冲区
  • 是否立即刷新缓冲区:输出机制,由于IO操作比较慢,先存入缓冲区,满了之后再存到内存,能够及时看到错误信息
  • std::flush只刷新缓冲区,std::endl刷新缓冲区+换行。效率低,只在必要的时候刷新缓冲区

image.png

命名空间:

using 语句可以放在函数内部,放在函数体外,尤其是放在头文件中,很容易出现冲突,最安全的写法是::

  1. namespace NameSpace1
  2. {
  3. void fun(){};
  4. }
  5. namespace NameSpace2
  6. {
  7. void fun(){};
  8. }
  9. int main()
  10. {
  11. //域解析符 ::
  12. NameSpace1::run();
  13. //using 语句
  14. using namespace NameSpace1;
  15. //名字空间别名
  16. namespace ns1 = NampSpace1;
  17. ns1::fun();
  18. }

mangling:名称改编

如下图,为该程序的对外接口,命名空间NameSpace1下的函数fun,被编译为_ZN10NameSpace13funEv
image.png

demangling

nm ./main.cpp.o | c++filt -t
image.png
#include printf
image.png

猜数字与控制流

if(y = 42)为了避免编写错误,可把常量放在左边进行条件判断

代码三种执行方式:顺序执行,分支执行(if),循环执行(while)

结构体与自定义数据类型

image.png
chapter 1.pdf