1、以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A. 是无限循环 B. 循环次数不定 C. 4次 D. 3次
解析:
• for循环:
for(初始化部分;条件判断部分;调整部分)
{
//循环语句;
}
• 逻辑与&&:
符号两侧的条件语句结果全为真(或非0)则判断结果为真。
若左侧的条件语句结果为假(或0),则右侧语句不再判断(或不执行)。
本题for循环的条件判断部分:
&&左侧,“y = 123”是一个赋值语句,它的值为123(非0,为真);
&&右侧,“x < 4"是一个比较语句,当变量x的值小于4时结果为真。
故本题的循环执行到x的值等于4结束,共执行4次,选C
2、以下程序的运行结果是()
#include <stdio.h>
int main(void) {
printf("%s , %5.3s\n", "computer", "computer");
return 0;
}
A. computer , puter B. computer , com
C. computer , computer D. computer , compu.ter
解析:
• 常量字符串结尾默认附带‘\0’:
如本题中"computer"在内存中实际为"computer\0"。
• %s打印:
%s打印字符串,遇到‘\0’时停止打印。
• %m.ns打印:
m:输出字符串的宽度;
n:从左起截取目标字符串n个字符,并右对齐打印,左边补齐空格。
当字符串长度 > n > m,实际打印的效果只与n有关,与m无关;
当n > 字符串长度,实际打印效果与%s一致。
本题选B
3、在以下代码中,
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};
p[1][2]的值是()
A. 1 B. 0 C. 6 D. 2
解析:
• 二维数组的定义和初始化:
第一个“[]”代表行,第二个“[]”代表列;
初始化时,每一个“{}”表示一行;
未初始化的部分会默认设为0。
本题中的int数组p一共有4列,行被省去,没有被完全初始化,它的真实情况为:
1 0 0 0
3 2 0 0
4 5 6 0
0 0 0 0
故p[1][2]的值是0,本题选B。
4、选择表达式 11|10 的结果(本题数值均为十进制)()
A. 11 B. 10 C. 8 D. 2
解析:
• 二进制数的转化:
用8个byte位来表示,11为“0000 1011”,10为“0000 1010”。
• 按位或 |:
两个参与运算的数值对应的二进制位上,两者有1则为1,两者全为0才为0。
如本题,0000 1011 | 0000 1010 = 0000 1011,转化为十进制数结果为11,故选A
5、
int fun(int a){
a^=(1<<5)-1;
return a;
}
fun(21)运行结果是()
A. 10 B. 5 C. 3 D. 8
解析:
• 左移<<:
m<<n:左侧的数值m的二进制位整体向左移动n位。
• 异或^:
m^n:对于m和n的二进制数的对应位置的值,当m的对应位置的值为0,且n为1时,结果对应位置的结果为1,其余情况都为0。
本题中,1的二进制数用8个byte位表示为0000 0001,1<<5的结果为0001 0000,转化为十进制数为32;
“a ^= (1 << 5) - 1”相当于“a = a ^ ((1 << 5) - 1)”,化简为“a = a ^ (32 - 1)”、a = a ^ 31”,意为将a原本的值与32异或后赋给a;
形参a接收实参后值为21,所以表达式最终为a = 21 ^ 31;
21的二进制数为:0001 1111,31的二进制数为:0001 1111,0001 1111 ^ 0001 1111 = 0000 1010,转化为十进制数为10,故选A。
6、若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()
A. *p+=1; B. (*p)++; C. ++(*p) D. *p++
解析:
• 表达式的优先级:
括号()内 > 解引用* = “++” > “+=”。
其中,解引用*和“++”的优先级相同,按从右到左的顺序执行。
• 前置++和后置++:
++是增1运算符,可以使被操作数自增1。前置++使被操作数先自增1,再调用;后置++使被操作数先调用,再自增1。
本题选D。
D项中,先执行后置++,再执行解引用*。后置++执行后,先对指针p解引用得到year变量,再对p本身的值(year变量的地址)进行自增1,并没有将year变量中的值从1009自增至1010。
7、组队竞赛
Q:怎么分组?怎么找最大的每组次大值之和?
#include <iostream>
using namespace std;
#include<algorithm>
#include<vector>
int main()
{
int n;
while(cin>>n)
{
vector<int> a;
a.resize(3*n);
for(int i=0;i<3*n;i++)
{
cin>>a[i];
}
sort(a.begin(),a.end());
long long sum=0;
for(int i=0;i<n;i++)
{
sum=sum+a[a.size()-2*(i+1)];
}
cout<<sum<<endl;
}
}
8、删除公共字符
Q:怎么在第一个字符串中找到第二个字符串中的每一个字符?
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1,str2;
getline(cin,str1);
getline(cin,str2);
int hash[256]={0};
for(int i=0;i<str2.size();i++)
{
hash[str2[i]]++;
}
string ret="";
for(int i=0;i<str1.size();i++)
{
if(hash[str1[i]]==0)
{
ret+=str1[i];
}
}
cout<<ret;
}