被初中生 C 语言考住了,尴了个尬

2022-08-28 11:32:15 +08:00
 52coder

周末来老婆老家,她亲戚有个小孩读初中,有个兴趣班学的 C 语言,得知我是从事软件开发 5 6 年的“高手”,饭后问了我一道编程题,我三俩下就告诉他怎么 怎么写,结果提交的时候始终显示有问题,一排查发现这里有坑,我手写一个 demo (可能编译不过哈)请教各位如下程序输出是什么?

#include <stdio.h>
int main()
{
    int arr[10] = {-1};
    //打印 arr 全部内容
    for(int i = 0;i < 10;i++)
    printf("%d",arr[i]);
    
    return 0;
}

我之前一直以为会全部输出-1 ,结果在 gcc 11.2.0 的环境下,输出确实一个-1 ,然后全是 0.有没有踩过这个坑的朋友?

10223 次点击
所在节点    程序员
83 条回复
kalluwa
2022-08-28 11:36:12 +08:00
这个不是坑,你只写了一个-1 ,那他就只填了第一个元素,其他默认留 0
dndx
2022-08-28 11:36:14 +08:00
https://en.cppreference.com/w/c/language/array_initialization

没毛病,这是标准定义的行为。
xtreme1
2022-08-28 11:36:31 +08:00
C99 Standard 6.7.8.21

If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
yehoshua
2022-08-28 11:37:59 +08:00
不完全初始化,只初始化了第一个 arr[0]。这不算什么坑吧,我记得就是这样设定的。
ailer
2022-08-28 11:38:19 +08:00
只有 0 的时候才会全部赋值 0 吧,而且 main 函数里声明数组是不会赋零值的,这个例子第一个是-1 ,后面是什么都有可能
Privileges
2022-08-28 11:39:40 +08:00
只初始化了数组的第一个元素吧
bruce0
2022-08-28 11:45:03 +08:00
这个我记得一开始学 C 语言的时候,就接触过这个问题, 不同的编译器实现的方式不一样, 有的编译器默认全是 0,有的是随机值. 因为 C 语言标准中没有规定这个东西
nulIptr
2022-08-28 11:46:09 +08:00
你这属于 c 语言用的少而且很久没用了,你猜 memset 为啥是常用函数
tyzandhr
2022-08-28 11:46:48 +08:00
标准的 C style 还要把循环里的 int 拿出来呢
hello2090
2022-08-28 11:46:57 +08:00
凭啥你只初始化了第一个却要求后面 9 个也是-1 ?
zooo
2022-08-28 11:46:57 +08:00
感觉这种用法,在实际中用的不多,比较有迷惑性

@ailer

这种题感觉就是记住标准怎么定义的,就清楚了
zooo
2022-08-28 11:47:46 +08:00
@hello2090 那凭啥 只有 0 时候,全部赋值 0 呢?
52coder
2022-08-28 11:48:10 +08:00
@dndx 是的,我刚也看到这个了,里面有个例子:
int z[4] = {1}; // z has type int[4] and holds 1,0,0,0
int w[3] = {0}; // w has type int[3] and holds all zeroes
以前写过 1-2 年 C ,这么写{0} 全部都是 0 ,如果不看上面的例子可能存在误导,以为这么写就是全部初始化
cherbim
2022-08-28 11:54:30 +08:00
根据我远古时期记忆,有的默认 0 ,有的可能就随机了
52coder
2022-08-28 11:55:28 +08:00
@nulIptr memset 不用猜,我好歹也写了 1-2 年 c ,c++ java 里,比如 vector ,可能 {10,-1}这种能指定,c 指定非 0 值还要 memset(arr,-1,sizeof(int)*10)大概这种。
52coder
2022-08-28 11:56:19 +08:00
@zooo 正解,我查阅文档前记得{0}全是 0 ,然后扩展一下,输入-1 ,结果只有第一个是-1
hello2090
2022-08-28 12:00:20 +08:00
@zooo 有道理哦,那你继续这么写,坚持自己,别停
52coder
2022-08-28 12:06:55 +08:00
@hello2090 不是坚持错误的写法哈,是分析{0}全 0 ,换成别的数字就不是全部,这种存在一定的误导性。
yhxx
2022-08-28 12:15:56 +08:00
这方面 JS 居然还是不错的,会默认 empty
ffire
2022-08-28 12:21:20 +08:00
@52coder 0 在 c 里太特殊了,false 是 0 ,其他都是 true ,返回 0 通常认为无错,指针和 0 搭上关系有时会出问题,等等,不得不说 0 潜移默化表达了很多所谓约定俗成或历史遗留,从这个角度说,那这里规定只是想表达初始化所有成员为 0 ,但我们没有初始化为其他值的简单方式,就容易接受了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/875942

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX