zoukankan      html  css  js  c++  java
  • 面试笔试(C++部分)

    1.define 和const,inline的区别

    define的缺点:

    1.边界效应(必须加括号,才能避免边界效应)

    #define MUL(A,B) A*B
    而在使用的时候,这样的调用:
    int a=1,b=2,c=3,d=0;
    d=MUL(a+b,c)
    经过编译时候展开,就变成了
    d=a+b*c
    而不是我们所希望的
    d=(a+b)*c
    [解决办法]
    其解决办法也很简单,就是给每个分量,都加上括号,就可以避免此类问题
    即,在宏定义的时候,如此定义:
    #define MUL(A,B) ((A)*(B))

    2、不能进行类型检查

    define定义的变量,是Compile-Time时期的变量,系统在编译时候,就将其全部替换,而不会对其变量进行类型等属性检查,相对不是很安全,可能存在潜在的问题,而没有发现.

    正因为其仅仅是编译时期替换,所以其定义的变量,是不会在运行时候分配内存的,不占用内存空间.

    const定义的变量,是 Run-Time时期的变量,如果类型不匹配,系统在运行时候,就会发现并提示或报错,对应的,const变量在运行时期,也是一种变量,系统会为其分配内存.

    3、编辑前就进行define替代,导致代码难以阅读和维护

    4、运行结果的不定性:

    #define max(a,b)      ((a)>(b)?(a):(b))
    int  a=5,b=10;
    
    max(++a,b);    //a++两次
    
    max(++a,b+10);   //a++一次

    define 和inline的区别:

    inline是内联函数,进行函数展开,不需要进行函数调用的过程,有类型检查

    define特有的功能,不能被inline和const替代的功能:

    用于#include和#ifdef和#ifndef的头文件重复包含

    头文件重复包含的坏处:1、有些头文件重复包含只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些

    2、有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)

    一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含。我们可以使用编译预处理命令避免这种情况的发生。

    例如,你想确保头文件max.h不会被重复包含,则你可以采取如下的形式:

     

     

    第一条预处理命令是说,如果MAXMIN_H不为真,说明此文件没被包含过,此命令后面的源代码有效(相当于:‘如果大门没关,请您进来’);

    第二条预处理命令把MAXMIN_H置为真(相当于请您把门锁插上,不让第二个人进来)。

    最后一条预处理命令是为了标出接受上述处理的源程序的范围(相当于您已经走到了后门)。

    但是,即便使用#ifdef #endif ,你必须记住预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将托慢编译速度,所以如果可能,应该避免出现多重包含。

  • 相关阅读:
    Hdu 1257 最少拦截系统
    Hdu 1404 Digital Deletions
    Hdu 1079 Calendar Game
    Hdu 1158 Employment Planning(DP)
    Hdu 1116 Play on Words
    Hdu 1258 Sum It Up
    Hdu 1175 连连看(DFS)
    Hdu 3635 Dragon Balls (并查集)
    Hdu 1829 A Bug's Life
    Hdu 1181 变形课
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4710209.html
Copyright © 2011-2022 走看看