変換器19、Dとプログラミング

二つの異なる種類のは、もちろん、一緒にコンパイラエラーを操作することはできません。

から
bool int型
byte int型
ubyte int型
short int型
ushort int型
char int型
wchar int型
dchar UINT

ローからハイに、昇進を入力します。ありません問題は発生しません截断

   int    a = 0;
    int    b = 1;
    size_t c = 0;
    writeln(a - b + c);  //最大整

いかなる正の整数がないため-1。
スライスを導くことができます静态数组

import std.stdio;

void foo() {
    int[2] array = [ 1, 2 ];
    bar(array);//静态数组
}

void bar(int[] slice) {//切片
    writeln(slice);
}

void main() {
    foo();
}

地元のセクションを返すか、ダングリングポインタを返すしないでください。

import std.stdio;

void foo() {
    int[2] array = [ 1, 2 ];
    bar(array);//静态数组

}  //在此外数组就释放了

int[] sliceForLaterUse;//全局

void bar(int[] slice) {//进来的切片参数可疑
    sliceForLaterUse = slice;//这里复制的是钥匙
//全局变量钥匙指向局部钥匙.
    writefln("钥匙内部: %s", sliceForLaterUse);
}

void main() {
    foo();
    writefln("全局钥匙: %s", sliceForLaterUse);
}

常に感じるd複雑に物事を。良くないとc++。スライスを誰が知っている、まだ重要なエンティティである、ああ、それは推測することは可能ではまだです、頭蓋骨は?移動したい
キーを押し生命期理论。0は、大生命期キー/ポインタがにないポイントができそうクラッシュの原因です。小生命期钥匙/指针

char[] parenthesized(const char[] text) {
    return "{" ~ text ~ "}";
}

void main() {
    char[] greeting;
    greeting ~= "你好世界";
    parenthesized(greeting);
}

多くの場合、非常に有効に- >これは、通常は問題ありません... 加限制

char[] parenthesized(const char[] text) {
    char[] argument = text;//编译错误
    ...
}

多くの場合=>非常に、申し訳ありませんが、コンパイルエラー。上記参照用です。

    const int totalCorners = 4;
    int theCopy = totalCorners;

この値は問題ありませんので、コピーされます。

   string a = "你好";    // 不变
    char[] b = a;//编译错误
    string c = b;//编译错误
//仍然是针对引用类型.
    immutable a = 10;
    int b = a;// 编译,值类型

列挙型。ピースを直接計算に関与して整数に変換することができます。

   int result = 10 + Suit.hearts;
    assert(result == 11);
  Suit suit = 2; //编译错误

極端な値の変換

int a = false;
    assert(a == 0);

    int b = true;
    assert(b == 1);
    bool a = 0;
    assert(!a);     // false

    bool b = 1;//0,1可转换,其余不行
    assert(b);      // true
    int i;
    // ...

    if (i) {    //
        // 非零

    } else {
        // ... i==0
    }
 int[] a;
    // ...

    if (a) {
    //非空针

    } else {
    //空针
    }

以下の状況が自動的に変換されない:
1、ワイド- >が狭くは
、CHANG - >となる
3は、同一の変換別
4、全体ため粉々により定義され
、明示的な変換を与えるために安全である場合:
1、構造。フー
2、std.conv.to、
3、std.exception.assumeUnique。
4、キャスト(...)。
例えば:

  int i;
    //DestinationType(value)
    // ...
    const result = double(i) / 2;
//类型(..)
    to!(DestinationType)(value)
//直接搞,犯错.
void main() {
    double d = -1.75;

    short s = d;     // 编译错误
    int i = "42";    // 编译错误
}
//这样就行了.
import std.conv;

void main() {
    double d = -1.75;

    short s = to!short(d);
    assert(s == -1);

    int i = to!int("42");
    assert(i == 42);
}
//也可转不变

    int[] slice = [ 10, 20, 30 ];
    auto immutableSlice = to!(immutable int[])(slice);//其实与`.idup`没啥区别.
//
    assert(&(slice[0]) != &(immutableSlice[0]));
//新实体了.

モバイルが一定になります

void calculate(immutable int[] coordinates) {
    // ...
}

void main() {
    int[] numbers;
    numbers ~= 10;
    // ... 其他修改...
    numbers[0] = 42;

    calculate(numbers);    // 编译错误
}
//编译错误
import std.exception;
// ...
    auto immutableNumbers = assumeUnique(numbers);
    calculate(immutableNumbers);
    assert(numbers is null); 
//这里的效果是,原来的可变变量被移动成不变的变量.
//而原来的变量被置为空针了.

上記toassumeUniqueの利点とっているcast
cast(DestinationType)value
ない仕事に置きます。

    Suit suit = to!Suit(7);    //抛异常
    bool b = to!bool(2);       //

それはその後で、正確ではないかもしれないが程序员保証正确性

    //可能不正确,但能够通过编译
    Suit suit = cast(Suit)7;
    bool b = cast(bool)2;
    assert(b);

ルームポインタ型、のみを通じてcast

    void * v;
    // ...
    int * p = cast(int*)v;

cast危険な、危険もはい:

    size_t savedPointerValue = cast(size_t)p;
    // ...
    int * p2 = cast(int*)savedPointerValue;

ポインタが変換さ正数れ、その後、変換しました整指针

公開された400元の記事 ウォン称賛25 ビュー10万+

おすすめ

転載: blog.csdn.net/fqbqrr/article/details/104587825