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。
标签:练习题,选项,语言,int,++,char,牛客,本题,指针 From: https://blog.csdn.net/a921876874/article/details/14290140010、下列函数定义中,会出现编译错误的是()
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。