《程序员面试宝典》学习记录1
第5章 程序设计基本概念
1、赋值语句
1)
x == (y=z); //先将z赋值给y,之后看x和y是否相等
x = (y==z); //先看y是否等于z,相等返回布尔值1,否则返回布尔值0
x = (y & z); //先求y与z的位与,之后赋值给x
x = (y && z); //先将y与z进行与运算,之后返回布尔值,赋值给x
总结:== && ||属于逻辑运算符,返回值为bool值
2)
x = x & (x-1); //x转化为二进制后包含1的数量
2、i++问题
#include<stdio.h>
main()
{
int b = 3;
int arr[] = {6,7,8,9,10};
sint *ptr = arr;
*(ptr++) += 123;
printf("%d\n", *(ptr-1)); //输出129
printf("%d\n", *ptr); //输出7
printf("%d,%d\n", *ptr, *(++ptr)); //输出8,8
}
总结:1)printf计算参数时候,是从右到左压栈的,所以最后一句要注意
2)*(ptr++)先取ptr指向的内容,之后在ptr+1
3)(*ptr)++先取ptr指向的内容,之后将指向的内容+1
3、类型的转换
1)
float a;
int(&a);
作用是因为浮点数在内存里和整数的存储方式不同,这相当于把该浮点数地址开始的sizeof(int)个字节当成int型的数据输出,只有当a = 0时候,int a才会和int(&a)相同。
2)
#include<stdio.h>
int main()
{
unsigned int a = 0xFFFFFFF7;
unsigned char i = (unsigned char)a;
char *b = (char*)&a;
printf("%08x, %08x", i, *b);
}
输出结果为000000f7,fffffff7
总结:前者为unsigned int 变量赋值给unsigned char变量时,会发生字节的截断,3位和高于3位的将会被程序自动丢弃;后者为将unsigned int 型指针转化为一个char型的指针,这个影响的是指针的寻址
4、运算符的问题
1)
#include<iostream>
using namespace std;
int main()
{
unsigned char a = 0xA5;
unsigned char b = ~a>>4+1;
printf("b=%d\n", b);
return 0;
}
运行结果为250.
总结:C/C++运算符优先级口诀! ~ ++ -- & + - >> << == != ^ | && || ?:
所以可以知道+优先级别比>>要高,所以先计算4+1故可以知道先取a反之后在右移5位;
这里还有一个特别容易错的地方,我们不能将0xA5转化为1010 0101我们应该写成16进制,之后因为unsigned char只能表示低8位的数值,所以为250.
2)用一个表达式判断一个数是否是2的N次方,不能用循环语气
!(X & (X-1))
3)用一个表达式取两个数的平均值
return((x & y) + (x ^ y) >> 1)
x&y取相同的位与;(x^y) >> 1取x和y的不同位,之后取平均
4)利用位运算实现两个整数的加法运算
int Add(int a,int b)
{
if(b == 0)
return a;//没有进位
int sum, carry;
sum = a ^ b; //完成没有进位的加法运算
carry = (a & b) << 1; //完成即为并且左移运算
return Add(sum. carry); //递归相加
}
5、a、b交换与比较
1)找出两个数中比较大
int max = ((a+b) + abs(a-b))/2; //方案1
int pair[2] = {a,b}; return pair[a < b]; //方案2
2)a与b进行交换
a = a ^ b;//用异或语句
b = a ^ b;
a = a ^ b;
6、C和C++的关系
1)在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"?
C++语言支持函数重载,C语言不支持,假设某个函数的原型为void foo(int x,int y)该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字,作用解决名字匹配的问题。
2)C语言是一种结构化语言,重点在于算法和数据结构,C程序的设计首先要考虑的是如何通过一个过程对输入进行运算处理得到输出;而对于C++首先要考虑的是如何构造一个对象模型,让这个模型能够契合与之对于的问题域,通过获取对象的状态信息得到输出或实现过程的控制。