0
点赞
收藏
分享

微信扫一扫

牛客小测验(C语言/C++)总结 第二弹(值得一看

三分梦_0bc3 2022-01-22 阅读 87

1. a=3*5 , a*4; 最终a为60 是否正确? 错误❌

解析:a=3*5,a*4; 首先执行第一步:a=3*5=15 成功给a赋值为15;再计算a*4=60;但这一步并未牵扯赋值运算!所以a的值仍未15。但如果将题目改为:b=(a=3*5,a*4); 则输出a=15,b=60(考察逗号运算符:整个表达式结果为逗号运算符最右边表达式结果)

2. 下面的程序的输出是什么? 答案为:x=tse,y= (解析如下)

#include<stdio.h>
#include<string.h>
int main(void){
 int n;
 char y[10] = "ntse"; //(1)
 char *x = y; //(2)
 n = strlen(x); //(3)
 *x = x[n]; //(4)
 x++; //(5)
 printf("x=%s,", x); //(6)
 printf("y=%s\n", y); //(6)
 return 0;
}

(1)char y[10] ="ntse"; 定义字符类型数组,开辟10个内存单元(最后一位为'\0')存储了长度为5的字符串"ntse\0"(y[0]='n',y[1]='t',y[2]='s',y[3]='e',y[4]='\0')

(2)char* x=y; 定义一个字符类型指针x,将y(数组名:数组首元素的地址)赋给x,此时x指向y数组首元素 x=&y[0];

(3)n=strlen(x); n=4(strlen计算字符串长度 不包括'\0')

(4)*x=x[n]; 即将x[4]='\0'赋值给*x=*(x+0)=x[0]=y[0],故此时y[10]数组存储元素为:y[0]='\0',y[1]='t',y[2]='s',y[3]='e',y[4]='\0',

(5)x++; x此时指向y数组第二个元素地址 x=&y[1];

(6)输出x=tse,y= (x正常输出字符串tse,遇到y[4]='\0'字符串结束标志结束输出;y=,由于此时y[0]已经被赋值为'\0',因此输出y时,遇到'\0'直接停止输出,所以什么都不输出)

3. 指针函数与函数指针:

(1)指针函数本质是一个函数,函数返回值为一个地址值,返回类型为某一类型的指针类型。定义一个指针函数格式:类型标识符 *函数名(参数列表)。

//例如
int* fun(int x,int y){} //定义一个指针函数,本质为一个返回类型为指针、返回值为地址值的函数
int* p;
p=fun(3,1); //调用fun函数,将其返回值赋给指针变量p

(2)函数指针指向函数的指针变量,其本质为一个指针变量。定义一个函数指针格式:类型说明符 (*函数名)(参数列表)。

//例如
int(*f)(int x,int y); //定义了一个函数指针,本质为一个指针变量f,指向返回类型为整型的、参数列表为(int ,int )的函数
int fun(int a,int b){}
f=fun; //将fun函数首地址赋给指针变量f

4. 下面程序执行输出结果为:7

#include <stdio.h>
int fun(int i) {
    int cnt = 0;
    while(i) {
        cnt++;
        i = i&(i-1); //重点语句!!!
    }
    return cnt;
}

int main() {
    printf("%d\n", fun(2017));
    return 0;
}

 函数就是为了使程序功能化、模块化。本题中fun函数功能只需注意到其返回值为cnt,而cnt出现在while循环中,与i=i&(i-1) ”同生共死“。该表达式涉及位运算!

i = i & (i-1),统计i的二进制中有多少个1
i = i | (i+1),统计i的二进制中有多少个0

此处i=2017,其二进制表示为:11111100001。其中共有7个1,故易知函数返回7。(先搞明白函数功能是什么会让读程序题更加简便)

5. 下面程序的输出是:18

#include <stdio.h>
int main() {
    int x=023;
    printf("%d\n",--x);
}

(简单 易错)定义整型变量x=023,需要注意:x为8进制!(以0开头为8进制;以0x开头为16进制),而输出时格式控制符为%d(以十进制输出),故先将8进制 023 转为10进制:19再 --x:(前置--)先-1再赋值 x=x-1=19-1=18。 

8进制->10进制:【按权相加法】个位数*8的0次方+十位数*8的1次方+......

6. 下面程序输出的是:24

#define f(x) x*x
main (){
 int a=5,b=2,c;
 c=f(a)/f(b);
 printf("%d",c);
}

 考察宏定义:直接替换!!  c=f(a)/f(b)=a*a/b*b=5*5/2*2=25/2*2=12*2=24;(不要擅自加括号!)

7. 假设在上下文和头文件正常的情况以下,下面程序的结果是什么:abddcccd

char* f(char *str, char ch) { 
    char *it1 = str; 
    char *it2 = str; 
    while (*it2 != '\0') { 
        while (*it2 == ch) { it2++; } 
        *it1++ = *it2++; 
     } 
    return str; 
} 
void main(int argc, char *argv[]) { 
    char *a = new char[10]; 
    strcpy(a, "abcdcccd"); 
    cout << f(a, 'c'); 
}

调用该指针函数时传参(a,'c')。分析该函数功能:定义两个指针变量均指向字符串"abcdcccd",内部while循环起主要作用!

当*it2==ch='c'时it2指向下一个字符'd',然后*it2!=ch,退出内层while循环,执行先赋值后++操作(it1指向a[2]='c',it2指向a[3]='d',*it1=*it2='d' 赋值;再++:it1指向a[3]='d',it2指向a[4]='c')。开启下一次外层while循环->内层while循环:(*it2==ch)it2一直++直到it2指向a[7]='d'退出内层循环:此时it1指向a[3]='d',先赋值 再++:it2指向a[8]='\0' 退出外层循环。return str;  

8. 关于操作系统heap与stack说法中,正确的是:

heap 堆区一般由程序员分配和释放,(动态分配内存:由 malloc 函数从堆上分配内存,free函数释放内存)若程序员不释放,可能会造成操作系统的内存泄露。

stack 栈区由系统自动分配(静态分配内存),无需程序员干涉,存放函数的参数值,局部变量(全局变量存放在data数据区)。

举报

相关推荐

0 条评论