【摘要】
知识点包括:全局变量的二次赋值;计算转化为二进制后,数字中 1 的数量;用一个非循环表达式判断一个数是否是2的N次方;逻辑运算与位逻辑运算;printf 输入表达式的执行顺序;类型转换中字符截断与数值大小的关系;位运算两个数值的取平均与求和;无判断语句求取变量中较大存在;无中间量交换变量;C/C++关系。
【正文】
1. 赋值语句
考点:int i=i // 全局变量;
考点:与运算和按位与运算;
总结:== && ||属于逻辑运算符,返回值为bool值
?
#includeusing namespace std; int i = 1; int main() { cout< 考点:计算转化为二进制后,数字中 1 的数量。
int fun(int x) { int con = 0; while(x) { x = x&(x-1); con++; } return con; }
?
2. i++问题
考点:printf函数从右往左执行输出数据;
考点:(++ptr) 该语句的下一语句才有 ptr = ptr+1;
#includevoid main() { int b = 3; int arr[] = {6,7,8,9,10}; sint *ptr = arr; *(ptr++) += 123; printf(%d , *(ptr-1)); //输出129 printf(%d , *ptr); //输出7 printf(%d,%d , *ptr, *(++ptr)); //输出8,8 }
3、类型的转换
考点:作用是因为浮点数在内存里和整数的存储方式不同,这相当于把该浮点数地址开始的sizeof(int)个字节当成int型的数据输出,只有当a = 0时候,int a才会和int(&a)相同。
float a;
int(&a);
考点:unsigned char 与 char 位长;
考点:指针寻址;
#includeint main() { unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char *b = (char*)&a; unsigned char *c = (unsigned char*)&a; printf(%08x %08x %08x , i, *b, *c); int *p = 0; // ??? return 0; } 输出结果
000000f7
总结:前者为unsigned int 变量赋值给unsigned char变量时,会发生字节的截断,3位和高于3位的将会被程序自动丢弃;后者为将unsigned int 型指针转化为一个char型的指针,这个影响的是指针的寻址。
fffffff7
000000f7
Press any key to continue
?
4、运算符的问题
考点:运算符的优先级;
考点:隐式类型转换;
#includeusing namespace std; int main() { unsigned char a = 0xA5; unsigned char b = ~a>>4+1; printf(b=%d , b); return 0; }
运行结果为250.
总结:C/C++运算符优先级口诀 ! ~ ++ -- & + - >> << == != ^ | && || ?:
详见:C 语言运算符优先级(记忆口诀)
详址:http://blog.csdn.net/u013630349/article/details/47444939
首先将a和4的值转换为 int 型,即所为整数提升,再进行后续的运算。可以知道+优先级别比>>要高,所以,先计算4+1故可以知道先取a反之后在右移5位。得到结果后,将数值转换为 unsigned char ,再赋给 b。
这里还有一个特别容易错的地方,我们不能将0xA5转化为1010 0101我们应该写成16进制,之后因为unsigned char只能表示低8位的数值,所以为250。
考点:判断一个数是不是 2 的 N 次 幂
!(X & (X-1))
用一个非循环表达式判断一个数是否是2的N次方,2^N即为二进制的10,100,1000 ...
故,表达式为 0 ,则判断为是2的N次幂。
考点:用一个表达式取两个数的平均值
return((x & y) + (x ^ y) >> 1)
x&y取相同的位与,相当于相同位置保留且折半;(x^y) >> 1取x和y的非进位加法,右移相当于折半,之后取平均。
考点:利用位运算实现两个整数的加法运算
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交换与比较
考点:不使用判断与选择语句,找出两个数中比较大。
int max = ((a+b) + abs(a-b))/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++首先要考虑的是如何构造一个对象模型,让这个模型能够契合与之对于的问题域,通过获取对象的状态信息得到输出或实现过程的控制。
?