zoukankan      html  css  js  c++  java
  • C++程序设计基础(1)程序的编译和执行

    注:读《程序员面试笔记》笔记总结

    1.编译执行过程

    1.1预处理:

    (1)所有以#开头的代码都属于预处理的范畴:#include,#define,#ifdef(#ifndef,#endif),#other(其他宏指令)

    (2)处理预定义的宏:例如__DATA__,__FILE__(前后都是两个下划线)

    (3)用一个空格代替连续的注释

    (4)处理三元符:例如将??=替换成#(针对很古老的键盘,现在一般较少出现)

    1.2编译:

    对预处理后的代码进行词法、语法、语义分析,生成汇编代码(.s)

    1.3汇编:

    将汇编代码生成机器指令,生成目标文件(.o)

    1.4链接:

    和其他的目标文件以及库文件生成可执行程序

    2.面试题

    2.1简述#include<>和#include" "的区别

    答案:#include直接从编译器指定的路径进行搜索,找不到则报错;

    #include“ ”则先从程序所做目录进行搜索,然后再到编译器指定路径进行搜索,(自定义的此种方式合适),搜索不到报错。

    2.2简述#和##在define中的作用

    答案:宏定义中的#运算符将其后面的参数转换成字符串;

    宏定义中的##运算符将其前后的参数进行字符串连接。

     1 #define PRINTCUBE(x)    cout<<"cube("<<#x<<")="<<(x)*(x)*(x)<<endl;
     2 
     3 PRINTCUBE(5);
     4 
     5 //output:
     6 //cube(5)=125
     7 
     8 #define LINK3(x,y,z)    x##y##z
     9 
    10 LINK3(3,5,0)
    11 
    12 //output:
    13 //"350"

    2.3简述assert断言的概念

    答案:assert用于程序的DEBUG版本中检测条件表达式,如果结果为假,则输出诊断信息并终止程序。

    注意点:(1)assert是一个带参数的宏,不是一个函数;

    (2)在#include语句前加入#define NDEBUG则禁用assert宏(即含有assert的语句都会被忽略);

    (3)在RELEASE中assert会被忽略(即含有assert的语句都会被忽略);

    (4)一个assert最好只有一个条件判断语句;

    1 //修改前
    2 assert(grade>0 && grade<=6);
    3 //修改后
    4 assert(grade>0);
    5 assert(grade<=6);

    (5)在assert中不要去修改变量的值,否则在RELEASE中被忽略掉,造成结果不同;

    1 //修改前
    2 assert(success++>60);
    3 //修改后
    4 assert(success>60);
    5 success++;

    (6)对用户的参数输入判断时,使用if语句来参数合法性检测,不要用assert。

  • 相关阅读:
    burpsuite-小结
    docker化安装apollo
    Linux Shell基础篇——变量
    Linux 用户篇——用户管理命令之id、whoami、su、chage
    Linux 用户篇——用户管理命令之useradd、passwd、userdel、usermod
    Linux 用户篇——用户管理的配置文件
    Linux 基础——常用的Linux网络命令
    Linux 基础——关机重启命令shutdown、reboot等
    Linux 基础——文件搜索命令find
    Linux 基础——权限管理命令chown、chgrp
  • 原文地址:https://www.cnblogs.com/ys99/p/9155175.html
Copyright © 2011-2022 走看看