[疑难] 数组初始化的问题

soulmachine 2007-10-01
首先,D1.0和D2.0对数组的处理还真的不同。
import std.stdio;

int main(char[][] args)
{
        char[10] s = "abc";
        writefln(s);
        return(0);
}
这段代码在D1.0和D2.0下都编译通过,但运行出错,完全跟C的数组不同。
/////////////////////////////////////////////////////////////////
import std.stdio;

int main(char[][] args)
{
        char[] s1 = "abc";
        writefln(s1);
        return(0);
}
这段代码在D2.0下编译出错,在D1.0下编译通过,运行也正确。
    请大侠给我解释一下,thanks
tomqyp 2007-10-01
2.0下"abc"是const的,用const char[] s1 = "abc";
soulmachine 2007-10-01
第一个问题呢?
C++中char test[5] = "abc";或char test[5] ={'a', 'b', 'c'};
后面两个也可以被初始化为'\0',D中貌似不能
/////////////////////////////
根据编译器的信息,准确的说"abc"是invariant char[3u],看来D2.0在这点比D1.0有进步,看来象C那样初始化一个数组,这能写成:char[] s1 = ['a', 'b', 'c'];了。不过char[10] s;s的类型是char[10u],不是invariant,为什么可以赋值给静态数组s呢?
tomqyp 2007-10-01
第一个应该这样申明char test[5] = "abc\0";或者在要求传入C字符串的时候用toStringz("xxxxxx")的方式。

看楼主的几个问题,感觉楼主是把D在当C++用,如果每次写一个D程序的思路不是怎样用D来完成任务,而是用C++完成任务后怎么转换到D,那该多累啊,所以还是建议暂时忘掉已有的C++知识,认真再读一次文档,也许会有新的收获.
hohoyeh 2007-10-01
这样也不妥,呵呵````
我一直以来用C#,现在在努力学习D,感觉好多涉及C++的知识,不得不又去看看它在C++中的实现,累啊。。

感觉就是比C++放宽了又比C#严谨的语言。。
soulmachine 2007-10-01
第一个问题,我觉得D的处理更严谨,C++中char[5] test ={'a', 'b', 'c'}; 后面两个会自动初始化,而D就禁止了这种处理,test是char[5u]类型的,每次就给它5个元素,既然你只给它三个元素,干嘛不定义成char[3] test="abc"。不过还是有点不懂,既然"abc"是invariant的,为什么静态数组(动态的必须是)test可以不是invariant的?在动态数组的?
//////////////////////////////////////
第二个问题,其实我多注意编译器的出错信息还是可以搞定的。唉,本人的调试能力太差啊,基本都不调试,用眼睛在源代码里看
oldrev 2007-10-01
D2.0 的 const 系统还在争论,何必跟自己过不去
soulmachine 2007-10-02
原来如此,暂时结贴,多谢oldrev!
Global site tag (gtag.js) - Google Analytics