上图!

顺便贴心地把图中的代码贴了出来:(甚至连这个鬼畜的缩进都一样)
#include <iostream>
#include <cstring>
using namespace std;
int main()
{ static char a[3];
cin>>a;
cout<<a[1]<<a[2];
return 0;
}
我自己试了一下,控制台的输出符合选项B的描述,编译器是g++ (tdm64-1) 9.2.0。但是我怀疑这里是不是有UB。
我后来我想了一下,Windows 系统下敲回车会输出"\r\n"两个字符,所以这应该不是UB。
不过这就有了另一个问题:static修饰的局部变量数组会自动初始化为零吗?
下面是C语言的两份代码:
/** without static
* 有输出,显示在 index > 20000 时会有非 0 值*/
#include <stdio.h>
#define N 30000
int main(){
int i = 0;
char a[N];
for(i = 0; i < N; i++) {
if(a[i] != 0) {
printf("index : %d, value : 0x%0*hx\n", i, 4, a[i]);
}
}
return 0;
}
/** with static
* 无输出 */
#include <stdio.h>
#define N 30000
int main(){
int i = 0;
static char a[N];
for(i = 0; i < N; i++) {
if(a[i] != 0) {
printf("index : %d, value : 0x%0*hx\n", i, 4, a[i]);
}
}
return 0;
}
在我本地运行时这么个结果,编译器gcc version 9.2.0 (tdm64-1)。所以static修饰的局部变量数组会自动初始化为零吗?如果是的话就真的帮大忙了(指不用来个for循环手动初始化,手动优化常数项)