C语言错题之 8

前言:

今天依然是五道小题,都不难,主要是一些细节的知识。
这选择题做的真是让我大开眼界,长见识了(‍)

1.

题干:

点击此处跳转

答案:

ABCD

解析:

(解析取自牛客网,真的很讨厌并发的这种题)

A

y先执行++a,a为2;
y再执行printf,a入栈,在打印到终端之前切换到x
x执行++a,a为3;
x执行printf,输出3;再切换到y
y执行打印,输出2

B

x先执行++a,a为2;
x再执行printf,输出2;切换到y
y执行++a,a为3;
y执行printf,输出3;

C

x先执行++a,a为2;切换到y
y执行++a,a为3;
y执行printf,输出3;切换到x
x执行printf,输出3

D

类似C
执行++a操作但没有写回到内存

知识点

(1)并行的两个线程可随时被抢占

(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)

补充说明:
1.
函数栈帧的创建与销毁
2.
原子指令:

原子指令是计算机中的一种特殊指令,它能够在执行过程中保证操作的原子性。原子性指的是该指令的执行要么完全成功,要么完全失败,不存在部分完成的情况。
在多线程或并发编程中,原子指令可以用来保证共享数据的一致性和并发操作的正确性。常见的原子指令包括加法、比较交换、加载和存储等操作。

2.

题干:

点击此处跳转

答案:

C

解析:

这道题考的是细节,

a=-1

是赋值操作!!
接下来就很简单了,-1为真、0为假。
(学了这么久还是会在这种基础题上出错(‍)

3.

题干:

点击此处跳转

答案:

D

解析:

A

(*prt+1)是这个二维数组的第二行,即{4, 5, 6}
(*prt+1)[2]即可
外面多进行了一次解引用操作

B

*p是a[0],是1,此处+5,结果是6,但表示的不是数组元素a[1][2]
可以写成 (p+5)再解引用

C

选项输出的是数组元素a[1][2]的地址,应该在最外层再进行一次解引用操作

4.

题干:

点击此处跳转

答案:

A

解析:

B

不能直接将字符串赋值给数组名,数组名是地址

C

不能将两个字符数组直接互相赋值。如果想进行数组之间的赋值,可以使用strcpy函数
strcpy(arr1, “Hello”);

D

定义数组时,必须指定长度或者直接初始化。

5.

题干:

点击此处跳转

答案:

A

解析:

根据C99规定, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义,sizeof是运算符,它在编译时起作用,而不是运行时。
放在这道题的意思就是:
在编译时,直接得到了sizeof(int),在运行时,i++根本没有执行过。

sizeof(i++); 在编译的时候被翻译成
sizeof((i++的数据类型)) 也就是 sizeof(int); 不会执行i++了。

结语

今天的五道题到这里就结束了,我们下期见。

你可能感兴趣的:(C语言错题集,c语言,java,redis)