程序猿面试宝典(第四版)——读书笔记-1、第五章:程序设计基本概念

第五章    程序设计基本概念


5.1 赋值语句


x = x & (x-1);

count ++; //将 x 转化成二进制后包括的1的数量


5.2 i++ 问题

#include<stdio.h>

int main(void)
{
    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

<span style="font-size:14px;">    printf("%d,%d\n", *ptr, *(++ptr)); //输出8,8</span>

<span style="font-size:14px;">}</span>

注意:1、C中printf计算參数时候,是从右到左压栈的

2、*(ptr++)先取ptr指向的内容,之后在ptr+1

3、(*ptr)++先取ptr指向的内容,之后将指向的内容+1



5.4 类型转换


1、

float a; (int&)a;

"cout << (int&)a << endl;" 输出的结果是1065353216(0x3f800000)

由于浮点数在内存里和整数的存储方式不同。这相当于把该浮点数地址開始的sizeof(int)个字节当成int型的数据输出。


2、

#include<stdio.h>
int main(void)
{
unsigned int a = 0xFFFFFFF7;
unsigned char i = (unsigned char)a;
char *b = (char*)&a;

printf("%08x, %08x", i, *b);

}<span style="font-family: 'Helvetica Neue', Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', 'WenQuanYi Micro Hei', SimSun, Song, sans-serif; line-height: 22.3999996185303px; background-color: rgb(255, 255, 255);">	</span>

输出结果:000000f7,fffffff7

解析:前者为unsigned int 变量赋值给unsigned char变量时,会发生字节的截断,3位和高于3位的将会被程序自己主动丢弃。后者为将unsigned int 型指针转化为一个char型的指针,这个影响的是指针的寻址


5.5 运算符问题

优先级:初等运算符 () [] -> .  /  单目运算符  / 算术运算符  / (移位运算)关系运算符  / 逻辑运算符  / 条件运算符 /  赋值运算符 /  逗号运算符 


1、用一个表达式推断一个数是否是2的N次方,不能用循环语句

假设 x 减 1 后与 x 做与运算。答案若为。即是。 !(X & (X-1))


2、用一个表达式求两个数的平均值 return((x & y) + (x ^ y) >> 1) x&y取同样的位与;(x^y) >> 1取x和y的不同位,之后取平均


3、利用位运算实现两个整数的加法运算

<span style="font-size:14px;">int Add(int a,int b)
{
    if(b == 0) return a;<span style="font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; line-height: 19.9999942779541px; white-space: pre-wrap; background-color: rgb(255, 255, 255);">//没有进位</span>
    int sum, carry;
    sum = a ^ b;<span style="background-color: rgb(255, 255, 255);"> </span><span style="font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; line-height: 19.9999942779541px; white-space: pre-wrap; background-color: rgb(255, 255, 255);">//完毕没有进位的加法运算</span>
    carry = (a & b) << 1; //得到进位的值
    return Add(sum. carry); //递归相加
}</span>


5.6 a、b 交换与比較


1、找出两个数中间比較大的数 int max = ((a+b) + abs(a-b))/2


2、a与b进行交换

//用异或语句

a = a ^ b;

b = a ^ b;

a = a ^ b;


5.7 C和C++的关系


1、在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"?

首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的keyword。该keyword告诉编译器,其声明的函数和变量能够在本模块或其他模块中使用。


C++语言支持函数重载,C语言不支持,如果某个函数的原型为void foo(int x,int y)该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。作用解决名字匹配的问题。

2、C和C++各自的特点。

C语言是一种结构化语言。重点在于算法和数据结构,C程序的设计首先要考虑的是怎样通过一个过程对输入进行运算处理得到输出。

而对于C++首先要考虑的是怎样构造一个对象模型,让这个模型可以契合与之对于的问题域,通过获取对象的状态信息得到输出或实现过程的控制。



5.8 程序设计的其它问题


switch 语句的运用!

posted @ 2017-06-30 09:28  claireyuancy  阅读(131)  评论(0编辑  收藏  举报