关于VS调试快捷键说法错误的是:( )
A:错误,F5是开始调试,在遇到短点的位置可以停下来,Ctrl+F5是开始执行,不调试
B:正确,F10遇到函数时不会进入到函数体中,F11会
关于Debug和Release的区别说法错误的是:
A:正确,Debug为调试版本,一般在开发完成后发布工程前,调试代码都是在Debug模式下进行的
B:正确,Release版本最终是要发送给用户的,发给用户的版本必须要没有问题,测试人员就是最后一个把关的
D:错误,Release版本是不能调试的,一般都是在Debug版本下调试的,Release版本一般编译器会进行大量的优化,删除无用的代码,指令的次序调整等,让其速度更快
程序死循环解释
在VS2022,X86,Debug的环境下的代码
#include <stdio.h> int main() { int i = 0; int arr[] = {1,2,3,4,5,6,7,8,9,10}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hello bit\n"); } return 0; }
当i = 10时,arr[10]超出了数组的实际范围,发生数组越界,内存泄漏,程序可能会错误地写入不应访问的内存位置在内存中。随着数组下标的增长,往后越界有可能覆盖到 i 的内存区,此时arr[i]的地址与i相同,从而使arr[i] = i = 0,而i<=12时继续执行循环,这样造成了死循环
在C语言中,算术右移运算符(>>)用于将一个数的各个位向右移动指定的位数,空出的位用什么填充?
算术右移动补充的是0
原码、反码、补码说法错误的是( )
D关于符号位的描述说反了:0表示正数,1表示负数
下面代码的结果是:( )
#include <stdio.h> int main() { int i = 1; int ret = (++i)+(++i)+(++i); printf("ret = %d\n", ret); return 0; }
表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径
所以这个表达式可能因为计算顺序的差异导致结果是不一致的,所以表达式是错误的表达式。
可以在VS和Linux gcc测试,结果可能有差异。
下面哪些描述是正确的?
A: 每个字节分配一个地址的,不是每个bit位
D: 程序只能访问分配给自己的内存单元,否则就是非法访问了,不能随便访问内存空间的。
关于表达式求值说法不正确的是:( )
D: 错误,有了优先级和结合性,表达式也有可能有不同的计算路径,导致计算结果的差异。
下面代码的结果是:( )
#include <stdio.h> int i; int main() { i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }
C语言中,0为假,非0即为真。
全局变量,没有给初始值时,编译其会默认将其初始化为0。
i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A
这道题其实很隐蔽,真是虾仁猪心!!!