求帮忙看看一些杂七杂八的语言标准问题,蒟蒻太菜分不清qwq
查看原帖
求帮忙看看一些杂七杂八的语言标准问题,蒟蒻太菜分不清qwq
315991
HairlessVillager楼主2023/2/13 23:18

上图!

顺便贴心地把图中的代码贴了出来:(甚至连这个鬼畜的缩进都一样

#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循环手动初始化,手动优化常数项)

2023/2/13 23:18
加载中...