C语言错题之 8

简介: 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++了。

结语

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

相关文章
|
28天前
|
C语言
【C语言】错题本(3)
【C语言】错题本(3)
12 0
|
7月前
|
存储 编译器 C语言
C语言错题之 10
C语言错题之 10
91 0
|
1月前
|
C语言
C语言:初阶测试错题(查漏补缺)
C语言:初阶测试错题(查漏补缺)
21 0
|
8月前
|
C语言
C语言错题之 5
C语言错题之 5
38 0
|
5月前
|
C语言
C语言分支语句和循环语句经典题及易错题
C语言分支语句和循环语句经典题及易错题
60 0
|
8月前
|
存储 编译器 开发工具
C语言错题之 7
C语言错题之 7
47 0
|
8月前
|
C语言
C语言错题之 6
C语言错题之 6
39 0
|
8月前
|
存储 C语言
C语言错题4
C语言错题4
55 0
|
8月前
|
存储 C语言
C语言错题 1
C语言错题 1
69 0
|
8月前
|
C语言
C语言错题 2
C语言错题 2
63 0