【求职】程序员面试宝典--笔记

第5章 程序设计基本概念

5.1 赋值语句

1. 这个合法(不过不合理),变量从生命的那一刻开始就是可见的了。main里的i不是1,因为它和main外的i无关,而是一个未定义值。

    注:声明和定义的区别。声明就是告诉编译器有这么个变量,但并不实现;定义就是真正实现这个变量,为之分配内存。该例就属于未定义。

  int i = 1;
  void main()
  {
      int i = i;
  }

2. y=z=5; 把5赋给z然后z赋给y。

    x==(y=z); 把z赋给y然后看x和y相等不。

    x=(y&&z); y和z进行与运算,如果与运算结果为真,则x=1,为假x=0。

    x=(y==z); x等于yz是否相等返回的布尔值

3. while(x)x = x & (x - 1) ;

    这个循环执行次数就是x转换为二进制后包含1的数量

    From 5.5.2: 用一个表达式判断一个数是否是2的N次方,答案是:!(x&(x-1))

5.2 i++

1. printf 是从右向左压栈的(因为这样输出时候就能从左向右输出?),所以遇到printf("%d %d", *ptr, *(++ptr))要注意第一个输出的ptr已经后移了。

    注:i++是先用后加,++i是先加后用。

5.3 编程风格

1. if('A' == a)比起if(a == 'A')有个好处,就是如果==写成了=,因为编译器不允许对常量赋值,所以会检测到错误。不过这个写法读着别扭。

5.4 类型转换

1. float a = 1.0f;

    float b = 0.0f;

    &a //输出的是a的地址。注:发现&b比&a小虽然b比a定义的晚,因为局部变量分配在栈里是从高地址往低地址分配的。

    (int&)a //相当于把a指向的内存当int型输出,1.0f在内存中的表示是0x3f800000,当int型输出变为1065353216(即0x3f800000的十进制表示)。

    (int&)b //因为b是0,所以当int表示也是0。

    注:计算机为什么喜欢用16进制 

    选择十六进制,是因为8位二进制的数字可以方便的转换为2个十六进制的数字。一个字节能且只能由一对十六进制来表示,比如10110110可以表示为B6。

2. unsigned int a = 0xFFFFFFF7;

    unsigned char i = (unsigned char)a; //uint赋值给unsigned char时会发生字节截断,前面三位将会丢掉,所以i是0x000000F7

    char* b = (char *)&a; //a是uint类型,取一个uint类型变量的地址,然后将其转换为指向char的地址,只是地址类型的转换

    //这样打印*b和a一样0xFFFFFFF7,影响的只是b+1和a+1,前者地址会加1*sizeof(char),后者是加4。

5.5 运算符问题

1. unsigned char a = 0xA5;

    unsigned char b;

    b = ~a>>4+1 //~的优先级最高,先对a取反;但是很奇怪啊,+比>>的优先级高!所以a的反要往右移5位。

                            //这个挺坑的,应该算代码风格不好,在Xcode里写这个直接出现警告,推荐修改是给4+1加上括号。

    cout << b //输出\372,这个没懂----所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示,372换成十进制是250

    printf("%d", b)//输出0。取反是0101 1010,右移后0000 0010,是2。

                            //因为是16位寄存器(一般都32,有问题),所以0xA5是0000 0000 1010 0101,右移后是0000 0111 1111 1010,

                            //又由于unsigned char只能表示低8位(最低的一个字节)的数值,所以最后是250,挺坑的。

    注:~是非,^是异或。老是想搞反。

2. 用一个表达式判断一个数是否是2的N次方,答案是:!(x&(x-1)). //对比5.1.3

3. (x&y) + ((x^y)>>1);   //f(729+271) = 500。其实是求平均值

                                        //x&y是x+y相同位的一半;x^y是不同位,右移1位是除以2,所以是不同位的一半。真是巧妙又蛋疼。

    //注:有个坑,x^y有括号,如果没有括号就是y先右移1位然后和x异或。

    //注:C语言运算符优先级 详细列表  看上去左移右移优先级还挺高的,低于+-高于<,>,<=,>=,例子x < y>>1,应该先右移y再比大小,合情合理。

    //注:C语言运算符优先级和口诀

5.6 a、b交换

1. 不利用中间变量实现a、b交换:a=a^b; b=a^b; a=a^b;

5.7 C和C++的关系

5.8 程序设计的其他问题

1. 实现了去掉源代码注释的一个小程序,可以看看

第13章 数据结构基础

13.1 单链表

1.










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值