《程序员面试宝典》学习笔记(1)

1.赋值语句:

   变量先声明再赋值,一条赋值语句占用一行

2.对i++、++i、i--、--i自增表达式的理解:

   前置++/--运算符为变量值加一/减一后参与运算,后置++/--运算符则为变量先参与运算然后值在加一/减一

3.编程风格:

   编写条件判断语句时常量值应放在前面,以避免书写错误而造成的bug;编写循环语句时把只参与一次的运算放在循环体外,以提高效率。

4.类型转换:

   c语言中的强制类型转换为在变量前加上所要转换的类型:

                                                    int val = 0x12ff;
                                                    char c;
                                                    c  =  (char)val;

   隐含的类型转换的情况:a.在混合类型的算术表达式中;

                                               b.用一种类型的表达式赋值给另一种类型的对象;

                                               c.把一个表达式传递给一个函数,调用表达式的类型与形式参数的类型不相同时,则会转换为函数的形式参数的类型;

                                               d.从一个函数返回一个表达式的类型与返回类型不同时,则会转换为函数返回值类型。

5.运算符问题:

   主要掌握运算符的优先级,判断表达式中先运算什么,再运算什么。

6.变量的交换与比较:

   两个数的交换函数

               方法一:

       <span style="font-family: Arial, Helvetica, sans-serif;">void swap1(int *a, int *b)</span><pre name="code" class="cpp">       <span style="font-family: Arial, Helvetica, sans-serif;">{    </span>
<span style="font-family: Arial, Helvetica, sans-serif;">                  int temp;</span>
<span style="font-family: Arial, Helvetica, sans-serif;">                  temp = *a;</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<span style="font-family: Arial, Helvetica, sans-serif;">                  *a = *b;        </span>
<span style="font-family: Arial, Helvetica, sans-serif;">                  *b = temp;                                  </span>
<span style="font-family: Arial, Helvetica, sans-serif;">              }</span>

 

 

               方法二:     

       void swap2(int *a, int *b)
       {
           *a = *a ^ *b;
           *b = *a ^ *b; 
           *a = *a ^ *b;
       }

   两个数大小的比较函数

               方法一:

<pre name="code" class="cpp">        <span style="font-family: Arial, Helvetica, sans-serif;">int max1(int a, int b)                           </span>
<span style="font-family: Arial, Helvetica, sans-serif;">               {                                                                  </span>
<span style="font-family: Arial, Helvetica, sans-serif;">                   return a >= b ? a : b;        </span>
<span style="font-family: Arial, Helvetica, sans-serif;">               }    </span>
 

 

                方法二:                                                                                               

        <span style="font-family: Arial, Helvetica, sans-serif;">#define abs(A) (((A) >= 0) ? (A) : (-A))   </span>
<span style="font-family: Arial, Helvetica, sans-serif;">                int max2(int a, int b)</span>
<span style="font-family: Arial, Helvetica, sans-serif;">                {</span><pre name="code" class="cpp">            return ((a+b)+abs(a-b)) / 2;   
        }
 

7.宏定义与const的区别:

   掌握宏定义的语法,在宏中将参数用括号括起来,防止出现边际效应。

   区别:const常量有数据类型,而宏常量没有数据类型;

               const常量可以进行调试,但是宏常量不能进行调试。


   const修饰指针的情况:若const在*的左侧,则指针所指的变量为常量,即变量值不允许改变,但指针可以指向其他地方;

                                             若const在*的右侧,则指针为常量,即指针不能指向其他地方。    

8.sizeof与strlen的区别:

   a.sizeof操作符的结果类型是size_t;

   b.sizeof是运算符,strlen是函数;

   c.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以‘\0’结尾的;

   d.数组做sizeof的参数不退化,传递给strlen就退化为指针;

   e.sizeof在编译的时候就计算过了,是类型或是变量的长度;

   f.strlen的结果要在运行时才能计算出来,用来计算字符串的长度,而不是类型占内存的大小;

  g.sizeof后如果是类型必须加括号,如果是变量名可以不加括号;

   h.当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。

       sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸;

   i.数组作为参数传给参数时传的是指针而不是数组,传递的是数组的首地址;

   j.计算结构体变量的大小时要考虑数据对其的问题;

   k.sizeof操作符不能用于函数类型、不完全类型或位字段。

9.内存中的数据对齐:

  sizeof计算栈中分配的大小。

   一般情况下,地址总线总是按照对齐后的地址来访问的。

   struct结构体的长度一定是其中最长的数据元素的整数倍。

   CPU的优化规则是:对于n字节的元素(n=2,4,8,...),它的首地址能被n整除,才能获得最好的性能。

10.内联函数和宏定义:

   内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。而宏只是一个简单的替换。

   内联函数要做参数类型检查,这是内联函数跟宏相比的优势。


   inline一般只用于如下情况:a.一个函数不断被重复调用

                                                     b.函数只有简单的几行,且函数内不包含for、while、switch语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值