今天依然是五道小题,都不难,主要是一些细节的知识。
这选择题做的真是让我大开眼界,长见识了()
点击此处跳转
ABCD
(解析取自牛客网,真的很讨厌并发的这种题)
y先执行++a,a为2;
y再执行printf,a入栈,在打印到终端之前切换到x
x执行++a,a为3;
x执行printf,输出3;再切换到y
y执行打印,输出2
x先执行++a,a为2;
x再执行printf,输出2;切换到y
y执行++a,a为3;
y执行printf,输出3;
x先执行++a,a为2;切换到y
y执行++a,a为3;
y执行printf,输出3;切换到x
x执行printf,输出3
类似C
执行++a操作但没有写回到内存
(1)并行的两个线程可随时被抢占
(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)
补充说明:
1.
函数栈帧的创建与销毁
2.
原子指令:
原子指令是计算机中的一种特殊指令,它能够在执行过程中保证操作的原子性。原子性指的是该指令的执行要么完全成功,要么完全失败,不存在部分完成的情况。
在多线程或并发编程中,原子指令可以用来保证共享数据的一致性和并发操作的正确性。常见的原子指令包括加法、比较交换、加载和存储等操作。
点击此处跳转
C
这道题考的是细节,
a=-1
是赋值操作!!
接下来就很简单了,-1为真、0为假。
(学了这么久还是会在这种基础题上出错()
点击此处跳转
D
(*prt+1)是这个二维数组的第二行,即{4, 5, 6}
(*prt+1)[2]即可
外面多进行了一次解引用操作
*p是a[0],是1,此处+5,结果是6,但表示的不是数组元素a[1][2]
可以写成 (p+5)再解引用
选项输出的是数组元素a[1][2]的地址,应该在最外层再进行一次解引用操作
点击此处跳转
A
不能直接将字符串赋值给数组名,数组名是地址
不能将两个字符数组直接互相赋值。如果想进行数组之间的赋值,可以使用strcpy函数
strcpy(arr1, “Hello”);
定义数组时,必须指定长度或者直接初始化。
点击此处跳转
A
根据C99规定, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义,sizeof是运算符,它在编译时起作用,而不是运行时。
放在这道题的意思就是:
在编译时,直接得到了sizeof(int),在运行时,i++根本没有执行过。
sizeof(i++); 在编译的时候被翻译成
sizeof((i++的数据类型)) 也就是 sizeof(int); 不会执行i++了。
今天的五道题到这里就结束了,我们下期见。