求余运算符% 位运算(<< >> & | ! ^ 左右移位,与,或,非 ,异或)
这些符号的运算对象都是整型
unsigned short x=0xffff
cout<<x;
cout输出的是整数,所以要将16进制数转化为整数
正常运算就行,结果是65535
如果将short改成unsigned short 那么结果变成-1
0xffff在内存中表示为16个1
16进制转2进制方法:
只需把每一位,变成二进制的四位数,然后拼在一起。
看个例子就懂了,ff bf 是二进制的几?答:1111 1111 1011 1111
16个1,最高位为1,表示负数,在二进制中是补码,要将其转化为原码
先末位-1,得到1111 1111 1111 1110 符号位不变,其余取反,得到1000 0000 0000 0001 ,此为二进制的-1
选D,e的x次方只能用exp(x)表示
double exp(double x); //返回e的x次方
转义字符 \xff 表示 转义字符能表示的最大16进制数
\177是转义字符能表示的最大8进制数
\178则要分为2部分 \17 和8
此外,想表示各种符号 \" \! \? 这样表示,都算一个字符
C++中,字符会尽可能多地结合
strlen()会统计第一个\0之前的字符个数
abcd00\0ahhf\0 用strlen求得结果是6
而sizeof()结果是13
无论自己加不加\0,放在数组中其会自动加上一个\0(数组大小为空时)
11.设有int i=010,j=10;
则 printf(“%d..%d\n”,++i,j--);的输出是。
(A) 11,10 (B) 9,10 (C) 010,9 (D)10,9.
010表示8进制,将其转化为10进制为8
答案为A
char *a="hello" 意思是将字符串的首地址赋给a
int *p ,*q; int k;
k=*p*(*q)这样计算是错误的
乘法*的优先级高于解引用*的优先级
正确运算是(*p)*(*q)
答案是 B C D
如果将*p改为p,结果是 BCD CD D
cout<<"abcd"的意思是输出以a的地址开始,到\0结束的所有字符
对于字符串都是这样
理解原理即可
如果定义变量:unsigned short a = 0x0f0f;与表达式~a等价的表达式是:()
(A)!a
(B)a&0xffff
(C)a ^ 0xffff
(D)al0x0000
选C
~是按位取反运算符
取反就是0变成1,1变成0
而^是异或运算符
运算方法是真真为假 假假为假 真假为真
A = 0011 1100
B = 0000 1101
A^B = 0011 0001
~A = 1100 0011
~a=0xf0f0
而a^0xffff=0xf0f0
所以选C
有如下定义,合法合理的数组元素访问是()。
int s[3][4] = { {1,4,7,10},{2,5,8,11},{3,6,9,12} };
int* pArr[3] = { s[0],s[1],s[2] };
int(*p)[4]; p = s;
int** q = pArr;
cout << *(s[3] + 2)<<endl;
cout << *(*(pArr + 2) + 4)<<endl;
cout << (*(p + 2))[3]<<endl;
cout << q[3][4]<<endl;
这题很简单 选C
s[3]是想表示第3行的首地址,但是s只有三行,所以最大为s[2]
*(pArr + 2) + 4和 q[3][4]是想表示第三行第四个元素,但第四个元素列下标为3
所以应该是*(pArr + 2) + 3和q[2][3]
char str[] = "HFUT\40Xuancheng\40campuses\x2e\n";
cout << sizeof(str);结果为?
26
\40 \x2e \n都算一个
\40是8进制的转义字符 \x2e是16进制的转义字符
void fun(int* p, int& s1, int s2, int n);
int main()
{
int a[10] = { 10, 8, 6, 4, 2, 1, 3, 5, 7, 9 };
int c = 0, d = 0;
fun(a, d, c, 10);
cout << c << "," << d;
return 0;
}
void fun(int* p, int& s1, int s2, int n)
{
s1 = 0;
s2 = 0;
for (int i = 0; i < n; ++i)
{
if (i % 2)
{
s1 += p[i];
}
else
{
s2 += p[i];
}
}
结果是0,27
注意s2是形参,不会影响实参值
s1是引用,会影响
而且要注意输出的位置:d 和 c是相反的
s1=8+4+1+5+9 i%2是取奇数下标的
题目:通过函数fun将无符号数字字符串按照给定计数系统的基转换为
对应十进制数并返回。
函数fun传递的参数是:s是数字字符串的首地址,b为计数系统的基(b大于等于2,小于等于10)。返回转换结果,如果数字字符串有不满足要求的字符返回-1。
如s指向的字符串是"12124",b是5。表示将"12124"作为5进制字符串转换为对应的10进制整数,返回结果为914。
再如:如s指向的字符串是"12123”,b是3。由于3超过3进制
的最大数2,所以错误,返回-1。
如果字符串中包含非数字字符,如-123返回-1,12.3返回-1(包含)+1223返回-1(包含+)等。
int fun(char *s,int b)
{
int sum = 0;
int k = 0;
while (*s)
{
k = *s - '0';
sum = sum * b + k;
if (*s < '0' || *s > '9')
{
return -1;
}
if (k >= b)//比如5进制,不能包含5,小于号不要忽略
{
return -1;
}
s++;
}
return sum;
}
题目:函数fun的参数是:p为数组的首地址,p指向的数据类型是双精度,n为元素个数。
函数的功能是:双精度数组的整数部分是5位,不足5位当5位处理。
要求:以双精度绝对值的整数部分的中间三位的值为大小依据按降序排序。
如:-27888.52 22177.83中的788比217大
-867.17,10262.27比较的对象是86和26主函数中测试数组a的排序结果(实际为1行显示):排序结果:29506.73 -18942.80 -18027.43 -27888.52 12496.14 32440.25 22177.83 91876.24 867.17 10262.27
说明:可使用fabs函数和强制类型转换运算或函数
void fun(double* p, int n)
{
int i, j;
double t;
for (i = 0; i < n - 1; ++i)
{
for (j = i + 1; j < n; ++j)
{
int k1 = (int)(fabs(p[i])) / 10 % 1000;
int k2 = (int)(fabs(p[j])) / 10 % 1000;
if (k1 < k2)
{
t = p[i];
p[i] = p[j];
p[j] = t;
}
}
}
}
先将浮点型转化为整型(只有整型能用%运算符)
先除以10,再取余1000就得到了某个数的中间三位
如23456 除10=2345 取余1000=345
645要的是64
645/10=64 取余1000还是64