【摘要】
知识点包括:全局变量的二次赋值;计算转化为二进制后,数字中 1 的数量;用一个非循环表达式判断一个数是否是2的N次方;逻辑运算与位逻辑运算;printf 输入表达式的执行顺序;位运算判断输入参数是否为2的幂次;位运算两个数值的取平均与求和;无判断语句求取变量中较大存在;无中间量交换变量;C/C++关系。
【正文】
1. 赋值语句
考点:int i=i // 全局变量;
考点:与运算和按位与运算;
总结:== && ||属于逻辑运算符,返回值为bool值
#include <iostream> using namespace std; int i = 1; int main() { cout<<i<<endl; // i = 1 int i = i; cout<<i<<endl; // i = -858993460 int y(4),z(3); int x = (y & z); //先求y与z的位与,之后赋值给x cout<<x<<endl; // x = 0 x = (y && z); //先将y与z进行与运算,之后返回布尔值,赋值给x cout<<x<<endl; // x = 1 return 0; }
考点:计算转化为二进制后,数字中 1 的数量。
int fun(int x) { int con = 0; while(x) { x = x&(x-1); con++; } return con; }
考点:printf函数从右往左执行输出数据;
考点:(++ptr) 该语句的下一语句才有 ptr = ptr+1;
#include<stdio.h> void 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 }
考点:作用是因为浮点数在内存里和整数的存储方式不同,这相当于把该浮点数地址开始的sizeof(int)个字节当成int型的数据输出,只有当a = 0时候,int a才会和int(&a)相同。
float a;
int(&a);考点:unsigned char 与 char 位长;
考点:指针寻址;
#include<stdio.h> int main() { unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char *b = (char*)&a; unsigned char *c = (unsigned char*)&a; printf("%08x\n%08x\n%08x\n", i, *b, *c); int *p = 0; // ??? return 0; }
输出结果
000000f7
fffffff7
000000f7
Press any key to continue
4、运算符的问题
考点:运算符的优先级;
考点:隐式类型转换;
#include<iostream> using namespace std; int main() { unsigned char a = 0xA5; unsigned char b = ~a>>4+1; printf("b=%d\n", b); return 0; }
这里还有一个特别容易错的地方,我们不能将0xA5转化为1010 0101我们应该写成16进制,之后因为unsigned char只能表示低8位的数值,所以为250。
考点:判断一个数是不是 2 的 N 次 幂
!(X & (X-1))用一个非循环表达式判断一个数是否是2的N次方,2^N即为二进制的10,100,1000 ...
故,表达式为 0 ,则判断为是2的N次幂。
考点:用一个表达式取两个数的平均值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); //递归相加 }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013630349/article/details/47439521