1、去掉了丑陋的宏。
C/C++中的宏是很令人厌烦的,D不允许再使用它。
2、好用的字符串常量表达式。
除了类C的使用双引号的字符串常量表达式以外,还可以使用`字符。可以使用x"68 65 6C6C 6F"来表示"hello",r"ab\na"则忽略字符串常量中转义字符的转义作用,还可以在字符串常量后加上c, w或d来指示字符串常量是char[]类型、wchar[]类型还是dchar[]类型。可以使用~运算符连接2个字符串。
3、数字。
数字可以直接使用,还可以这样来定义:int a = 3_029_301_000; 数字直接量(包括整数、浮点数、复数)表达式中,“_”字符是被忽略的。另外还直接提供了复数类型。
4、提供定长数组、变长数组、关联数组。
int[3] a定义一个定长数组;int [] a定义一个变长数组;int[int]定义一个关联数组,键类型是int,值类型是int;int[char[]] a定义一个关联数组,键类型是char[],值类型是int,使用非常方便。
可以使用foreach来遍历数组:
foreach
(
int
index,
int
value; a)
printf (
"
%d: %d\n
"
, index, value);
foreach
(
char
[] key,
int
value; a)
printf (
"
%.*s: %d\n
"
, index, value);
可以使用in操作符来判断某个值是否是关联数组的一个键:
int
[
char
[]] a;
if
(
"
hello
"
in
a)
writefln (
"
hello
"
);
数组可以切片(slice):
int
[] a;
int
[] b
=
a[
1
..
3
];
int
[] c
=
a[
1
..length];
等等。。。。
5、其它还支持委托、函数指针、模板、异常、RAII、契约式编程、单元测试、with语句、auto/typeof、垃圾回收、操作符重载、内联汇编、条件编译、嵌入到HTML等,它还标准化了ABI(这是C/C++最让人头痛的地方之一)。这些特性大部分都比较熟悉和实用,下面简单介绍一下条件编译和嵌入到HTML。
6、条件编译。
在D中,可以使用version(VersionID)来进行条件编译:
还可以使用debug条件:
或者:
debug printf ("hello");
静态条件编译:
类型检查:
7、嵌入HTML。
在一个HTML文件中,<code>和</code>之间的部分可以当作D代码来编译。比如下面这段代码:
把它存储为HTML文件,可以直接使用dmd编译器编译。
C/C++中的宏是很令人厌烦的,D不允许再使用它。
2、好用的字符串常量表达式。
除了类C的使用双引号的字符串常量表达式以外,还可以使用`字符。可以使用x"68 65 6C6C 6F"来表示"hello",r"ab\na"则忽略字符串常量中转义字符的转义作用,还可以在字符串常量后加上c, w或d来指示字符串常量是char[]类型、wchar[]类型还是dchar[]类型。可以使用~运算符连接2个字符串。
3、数字。
数字可以直接使用,还可以这样来定义:int a = 3_029_301_000; 数字直接量(包括整数、浮点数、复数)表达式中,“_”字符是被忽略的。另外还直接提供了复数类型。
4、提供定长数组、变长数组、关联数组。
int[3] a定义一个定长数组;int [] a定义一个变长数组;int[int]定义一个关联数组,键类型是int,值类型是int;int[char[]] a定义一个关联数组,键类型是char[],值类型是int,使用非常方便。
可以使用foreach来遍历数组:
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
可以使用in操作符来判断某个值是否是关联数组的一个键:
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
数组可以切片(slice):
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
等等。。。。
5、其它还支持委托、函数指针、模板、异常、RAII、契约式编程、单元测试、with语句、auto/typeof、垃圾回收、操作符重载、内联汇编、条件编译、嵌入到HTML等,它还标准化了ABI(这是C/C++最让人头痛的地方之一)。这些特性大部分都比较熟悉和实用,下面简单介绍一下条件编译和嵌入到HTML。
6、条件编译。
在D中,可以使用version(VersionID)来进行条件编译:
version (Win32)
{
//
}
else
{
// ..
}
{
//
![dot.gif](/Images/dot.gif)
}
else
{
// ..
}
还可以使用debug条件:
debug
{
//
}
else
{
//
}
{
//
![dot.gif](/Images/dot.gif)
}
else
{
//
![dot.gif](/Images/dot.gif)
}
或者:
debug printf ("hello");
静态条件编译:
const
int
n
=
1
;
static if (n == 1 )
writefln ( " hello " );
else
writefln ( " world " );
static if (n == 1 )
writefln ( " hello " );
else
writefln ( " world " );
类型检查:
int
n
=
3
;
if ( is (n[]))
writefln ( " like array " );
if ( is (n: int ))
writefln ( " is an integer " );
if ( is (n[]))
writefln ( " like array " );
if ( is (n: int ))
writefln ( " is an integer " );
7、嵌入HTML。
在一个HTML文件中,<code>和</code>之间的部分可以当作D代码来编译。比如下面这段代码:
<
h1
>
This is a test
</
h1
>
< code >
import std.c.stdio;
int < font size =+1 >< b > main </ b ></ font > ()
{
< span style ="color:red" > printf </ span > ( < u > " hello world\n " </ u > );
return 0;
}
</ code >
< hr />
< h1 > End </ h1 >
< code >
import std.c.stdio;
int < font size =+1 >< b > main </ b ></ font > ()
{
< span style ="color:red" > printf </ span > ( < u > " hello world\n " </ u > );
return 0;
}
</ code >
< hr />
< h1 > End </ h1 >
把它存储为HTML文件,可以直接使用dmd编译器编译。