首页 > 其他分享 >刷c语言练习题8(牛客网)

刷c语言练习题8(牛客网)

时间:2024-10-13 21:52:35浏览次数:9  
标签:练习题 选项 语言 int ++ char 牛客 本题 指针

1、如果有int a=5,b=3,在执行 !a&&b++; 后a和b的值分别是()

A、5,3

B、0,1

C、0,3

D、5,4

答案:A

解析:按照优先级顺序,先计算!a,得到0。由短路法则,b++不进行计算,又!a并没有改变a的值,所以a和b的值分别是5,3,选择选项A。

2、以下程序的输出结果是( )

1

2

3

4

5

6

7

main(){  

    int x = 2, y = -1, z = 2;

    if (x < y)

        if (y < 0) z = 0;

        else z = z + 1;      

    printf(“%d\n”, z);

}

A、3

B、2

C、1

D、0

答案:B

解析:本题要注意的是所有的 if else 后都没有加花括号。首先判断 if(x < y)为假,所以if(y<0)不执行,又else与最近的if结合,所以else后的z=z+1也不执行。最后z原样输出为2,所以本题选择选项B。

3、 在32位操作系统中,我们定义如下变量 int (*n)[10]; 请问调用函数sizeof(n),返回值为()

A、4

B、40

C、8

D、80

答案:A

解析:不论指针变量是什么类型,在32位操作系统中大小为4,在64位操作系统中大小为8,故本题选择选项A。

4、test.c文件中包括如下语句:

1

2

3

4

#define INT_PTR int*

typedef int*int_ptr;

INT_PTR a,b;

int_ptr c,d;

文件中定义的四个变量,哪个变量不是指针类型?

A、a

B、b

C、c

D、d

E、都是指针

F、都不是指针

答案:B

解析:理解宏定义和typedef的区别,宏定义是直接替换,typedef是给一个已经存在的数据类型引入一个别名。所以,a、c、d是整型指针变量,b是整型变量,本题选择选项B。

5、以下正确的表达式是( )。

1

2

3

    char **s;

    char* str = "data";

    s = &str;

A、s="computer";

B、*s="computer";

C、**s="computer";

D、*s='c';

答案:B

解析:选项A中,s的类型是char **,等式右边字符串首地址的类型应该是char *,两边的类型不匹配,故选项A错误。选项B中,等式左右的类型一致,目的是改变指针str的指向,故选项B正确。选项C中,**s代表的含义是字符串"data"的内容,这是一个常量,不能进行修改,故选项C错误。选项D中,等式左边的类型是char *,需要等式右边是一个地址,但此时等式右边是单个字符,二者类型不匹配,故选项D错误。综上,本题选择选项B。

6、下列 C 代码中,不属于未定义行为的有:______。

A、int i=0; i=(i++);

B、char *p="hello"; p[1]='E';

C、char *p="hello"; char ch=*p++;

D、int i=0; printf("%d %d\n",i++,i--);

E、都是未定义行为

F、都不是未定义行为

答案:C

解析:未定义行为(Undefined Behavior)在C语言(以及C++等其他编程语言)中是一个重要的概念,它指的是程序执行时的行为在当前程序状态下的行为在其所使用的语言标准中没有规定。换句话说,当程序执行到某个点时,由于某些原因(如错误的程序结构、错误的数据使用等),其行为变得不可预知,并且语言标准也没有对这种情况下的行为做出任何规定。

A选项中的i=(i++),执行i++,先返回i的当前值再进行自增操作,下面是将一个值赋值给i和i++这两个操作,两个操作都会改变i的值,并且没有规定哪个操作应该先执行,所以结果是不确定的,产生未定义行为。

B选项中利用指针去修改一个字符串常量的值,B选项错误。

D选项中两个都是后缀递增递减,但是两个操作之间的顺序并没有定义,由于两个操作执行顺序的不同会产生不同的结果,是未定义行为。

综上,本题选择选项C。

常见的未定义操作有:

1、数组的越界访问:访问数组时超出了其定义的大小。

2、指针解引用:解引用空指针或者野指针。

3、悬空指针:使用已经释放的指针。

4、整数溢出:整数类型运算结果超出了该类型能表示的范围。

5、函数返回局部变量的地址:函数返回局部变量的地址,并在函数外部使用该地址。

6、使用未初始化的变量。

7、变量既是左边结果,又是右边的操作数。

7、在说明语句int *f( );中,标识符f代表的是()

A、一个用于指向整型数据的指针变量

B、一个用于指向一维数组的行指针

C、一个用于指向函数的指针变量

D、一个返回值为指针型的函数名

答案:D

解析:选项A描述的表示:int * f。

选项B描述的表示:int (*f)[N](N为常量)。

选项C描述的表示:int (*f)( )(假设函数参数缺省,返回值为int类型)

选项D描述的表示:int *f( ) ,从题目中语句内优先级来看,从f出发先与( )结合表示是一个函数,再与int *结合表示返回值为指针型。

综上,选择选项D。

8、 下列函数的作用是,将数组中的两个数值进行交换,即调用函数后,arr变为{20,10},

1

2

3

voidchange(int* p) {

/*……*/

}

若要正确实现函数功能,/*……*/为()

A、

int temp = p[0];
p[0] = p[1];
p[1] = temp;

B、

p[0] = p[0] ^ p[1];

p[1] = p[1] ^ p[0];

p[0] = p[0] ^ p[1];

C、

int n1 = p[0];
int n2 = p[1];
int temp = n1;
n1 = n2;
n2 = temp;

D、

int temp = *p;
*p = *(p+1);
*(p+1) = temp;

答案:ABD

解析:本题选出正确选项比较容易,记录的原因是这里除了使用中间量进行交换,还使用了异或运算完成两个数的交换。选项A和选项D是等价的,因为这里的*和[ ]可以互换。选项C只交换了被调函数中局部变量的值,数组中的内容没有发生改变,并且这个局部变量在调用结束后就被释放了。故本题选择选项ABD。

9、 下面程序运行后的结果为:

1

2

3

4

5

6

7

char str[] = "glad to test something";

char *p = str;

p++;

int *p1 = reinterpret_cast<int *>(p);

p1++;

p = reinterpret_cast<char *>(p1); 

printf("result is %s\n", p);

A、result is glad to test something

B、result is ad to test something

C、result is test something

D、result is to test something

答案:D

解析:解决本题主要理解两个关键点,一个是reinterpret_cast是什么意思,一个是指针移动是以什么为基本单位的。reinterpret_cast是 C++ 中的一种强制类型转换操作符,它允许程序员将一种数据类型的指针或引用转换为另一种完全不同的数据类型的指针或引用。首先定义了一个指针p指向字符串"glad to test something"的首地址(即字符g的地址),然后p++,由指针p指向的类型为char,所以p++是指针p指向的地址加上一个char类型所占的空间(即一个字节),此时指针p指向字符'l'。然后将p指针强制转换为int类型并赋给指针p1,p1++是指针p1指向的地址加上一个int类型所占的空间,此时指针p1指向字符't',然后将指针p1强制转换为char * 类型并且赋给指针p,所以此时指针p指向字符't'。以%s进行输出,输出结果为选项D。

10、下列函数定义中,会出现编译错误的是()

A、max(int x,int y,int *z) { int z; z=x>y?x:y; return z; }

B、int max(int x,y) { *z=x>y?x:y;}

C、max (int x,int y) { int z; z=x>y?x:y; return(z); }

D、int max(int x,int y) { return(x>y?x:y);}

答案:ABC

解析:在选项A中,z作为参数传入,但是在函数体中重复定义了,错误。在选项B中,函数体里直接使用了z,但是没有对z进行定义,错误。如果本题在C++中,不能允许函数没有返回值类型,错误。所以本题选择ABC。 

标签:练习题,选项,语言,int,++,char,牛客,本题,指针
From: https://blog.csdn.net/a921876874/article/details/142901400

相关文章

  • Java语言中1.方法调用栈 2.栈帧 3.局部变量表 4.操作数栈 5.动态链接 6.方法的入参存
    在Java语言中,理解方法调用栈、栈帧、局部变量表、操作数栈等概念非常重要,它们与方法的执行和内存管理密切相关。下面是对这些概念的详细解释及它们之间的关系:1.方法调用栈(MethodCallStack)方法调用栈是每个线程维护的一块内存区域,用于存储线程执行时的栈帧(每个栈帧对应一次......
  • 【妙趣横生】01_C语言的指针是啥?为啥那么难懂?
      引入:C语言的指针是啥?为啥那么难懂?C语言中的指针是C语言的一个核心概念,也是其强大和灵活性的重要来源之一。然而,对于初学者来说,指针确实可能是一个难以理解的概念。下面我会尽量用简单的语言来解释什么是C语言中的指针,以及为什么它可能会让人觉得难懂。趣味解释:C语言......
  • 【趣学C语言和数据结构100例】
    【趣学C语言和数据结构100例】问题描述找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无......
  • PTA C语言 7-1 字符串比对 单位 郑州轻工业大学输入两个长度相同的字符串,字符串长度小
    7-1字符串比对分数10作者 zzuli单位 郑州轻工业大学输入两个长度相同的字符串,字符串长度小于20,且只包含英文字符。将两个字符串逐字符对比的结果输出(由+和-构成的一行字符),具体规则如下:如果两个字符串对应字符是同一字母则输出+如果两个字符串对应字符不是同一字母......
  • c语言栈-回文
    include<stdio.h>include<stdlib.h>defineMAXSIZE7//定义结构体structStack{charworld[MAXSIZE];inttop;};//定义栈structtemp{structStacks;};intmain(){Stacks{};//入栈charc1[MAXSIZE]={0};printf("输入字符串,最多%d个字符\n",MAXSI......
  • C语言中以下概念,以及这些概念之间的关系: 1.代码段 2.数据段 3.堆栈 4.全局变量 5.局部
    在C语言程序中,内存布局通常被分为几个主要的区域,每个区域都有不同的用途。以下是关于代码段、数据段、堆栈、全局变量、局部变量和函数的详细描述,以及它们之间的关系。1.代码段(TextSegment)代码段(也称为textsegment)是程序的只读部分,存储的是程序的指令(即代码)。这是可执行文......
  • WebAssembly 基础以及结合其他编程语言
    0x00WebAssembly基础详情参考《WebAssembly|MDN》(1)概述WebAssembly简称WASM或WA,是一种新的编码方式,可以在现代的Web浏览器中运行可以通过编译器,把多种编程语言(如C/C++、C#、Go、Python、Rust、TypeScript等)编写的代码转化为WA,并在浏览器中使用特点:灵活度高......
  • C语言在Linux上编程的步骤
    如果对你有帮助,请点个免费的赞吧,谢谢汪。(点个关注也可以!)如果以下内容需要补充和修改,请大家在评论区交流~让大家都看见1.编程前的准备1.1新建文件夹mkdir【选项】【文件名】1.2选择编程工具1.使用VScode:code【文件或者目录】2.使用vi编译器(这里先不使用)1.3打开编......
  • 2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动
    2024-10-13:用go语言,给定一个二进制数组nums,长度为n,目标是让Alice通过最少的行动次数从nums中拾取k个1。Alice可以选择任何索引aliceIndex,如果对应的nums[aliceIndex]是1,Alice会拾取一个1并将其设为0。之后,Alice可以选择以下两种行动之一:将一个0变为1(最多执行maxCh......
  • 【汇编语言】第三章----寄存器(内存访问)(一)—— 内存中字的存储
    文章目录前言1.内存中字的存储2.问题3.问题分析与解答4.结论结语前言......