【摘要】
知识点包括:全局变量的二次赋值;计算转化为二进制后,数字中 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