被初中生 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 条回复
cigarzh
2022-08-28 21:07:40 +08:00
没意义+1 ,建议直接进行一个魅的祛
推荐个 https://cppinsights.io
:)
YooUzi
2022-08-28 21:19:52 +08:00
C 语言不能 for 循环里初始化数吧,C++倒是可以
mikewang
2022-08-28 21:25:42 +08:00
#15 @52coder
#42 @microxiaoxiao

补充一下,恰巧在全填 -1 的情况下,memset 可以正常工作。memset(arr,-1,sizeof(int)*10) 没问题
-1 的补码为全 1 ,因此不管是多少 bit 的有符号类型,值都是 -1 。
另外一个特例,就是 0 (全 0 )。

换成另外的数字,比如 memset(arr, 1, sizeof(int)*10) 就要出事故了 hhh
52coder
2022-08-28 21:27:26 +08:00
@ziyifan824 为什么不能?循环遍历初始化一遍是可以的。
52coder
2022-08-28 21:31:16 +08:00
@documentzhangx66 你这也是人才,如果数组 100 个,1000 个,你就不能教人写个 for 循环吗😁
microxiaoxiao
2022-08-28 21:32:49 +08:00
@mikewang ,奇淫巧计自己用肯定没啥问题的,嘿嘿。项目大了,容易出毛病,有时候别人随手一改。
52coder
2022-08-28 21:33:48 +08:00
@mikewang 是的,-1 和 0 可以通过这种方式初始化,但这种方式不通用,不通用的方式就不要用了,容易误导不知情的吃瓜群众,比如别人复制了代码,修改了初始值,就会导致问题了。
mikewang
2022-08-28 21:40:27 +08:00
@microxiaoxiao
@52coder
各位说的对,正确做法还是循环赋值。
只是想说明一下 -1 也能出正确结果的原因。

这里做个提示吧:非标准行为,大家不要学我哦~
longbowape
2022-08-28 22:42:59 +08:00
@icyalala http://port70.net/~nsz/c/c99/n1256.html#4p2 If a ''shall'' or ''shall not'' requirement that appears outside of a constraint is violated, the behavior is undefined.
longbowape
2022-08-28 22:46:36 +08:00
@dlsflh https://www.rfc-editor.org/rfc/rfc2119.html
1. MUST This word, or the terms "REQUIRED" or "SHALL", mean that the
definition is an absolute requirement of the specification.

2. MUST NOT This phrase, or the phrase "SHALL NOT", mean that the
definition is an absolute prohibition of the specification.

3. SHOULD This word, or the adjective "RECOMMENDED", mean that there
may exist valid reasons in particular circumstances to ignore a
particular item, but the full implications must be understood and
carefully weighed before choosing a different course.

4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED" mean that
there may exist valid reasons in particular circumstances when the
particular behavior is acceptable or even useful, but the full
implications should be understood and the case carefully weighed
before implementing any behavior described with this label.
longbowape
2022-08-28 22:49:23 +08:00
@dlsflh shall 确实是强制的,我和 should 混了
gdgoldlion
2022-08-28 23:00:01 +08:00
真想用这类写法,就封装一下
不能指望所有人都熟悉标准手册

兴趣班 c 语言成天教这种东西
老师不咋地
能退就退了吧
Kasumi20
2022-08-29 01:01:04 +08:00
不会就学
FirefoxChrome
2022-08-29 01:23:23 +08:00
C 语言这么麻烦

对于新手入门来说,学个 C# Python 不好吗?或者 PHP 建个网站
litguy
2022-08-29 08:38:49 +08:00
你的确该尴尬一下,大学教科书都讲清楚了,竟然工作几年还有疑惑
zhicheng
2022-08-29 08:50:59 +08:00
@52coder 不太理解这种不会又要硬凹的心理。bool 没有规定就是一个字节,memset 初始化一个字节的数组也不是 trick 。
rpish
2022-08-29 09:43:00 +08:00
兴趣班不应该教 Python 吗?
这是准备打奥赛?
ragnaroks
2022-08-29 18:09:12 +08:00
用 C 就别用数组了,老实

int * array = calloc(count,typeSize)
zhanlanhuizhang
2022-08-30 09:25:39 +08:00
这个一眼就看出来,后面肯定是 0 。大学学的。
jiulang
2022-08-30 10:57:30 +08:00
如果是 c#,这妥妥的语法异常哈,类似的有:
if (number = 0)
{
// do something
}

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

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

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

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

© 2021 V2EX