論理積で1以上かつ12以下を判定した場合、それ以外(else側)では、自然と1未満または12をこえるという判定になっている、ということです。 ですから12if. cと13if. cは同じ内容のプログラムです。 プログラマが自分で分かりやすい方を選択すればいいことになります。 論理積を2つ使って時分の判定を行うプログラムを作ってみました。 サンプルプログラム 14if. c /*14if. c 判定をする(判定の入れ子:判定の中で判定をおこなう) */
int hour, minute;
printf("今朝の起床時間を教えて下さい\n");
printf("何時? (0-12) ");
scanf("%d", &hour);
if(hour >= 0 && hour <= 12){
printf("何分? (0-59) "); /* hourが0~12の間のときだけ何分かを聞いてくる */
scanf("%d", &minute);
if(minute >=0 && minute <= 59){
printf("%d時%d分ですか。", hour, minute);
printf("アリバイはありますか?\n");}
printf("時間は0~59で入力して下さいね\n");}}
printf("時間は0~12で入力して下さいね\n");}
解説 最初のif文で入力された時間がが正しいか(0~12の範囲かどうか)を判定しています。 正しければ、さらに分を入力させて正しいか(0~59の範囲かどうか)を判定しています。 したがって、いずれのelse文も間違った値が入力された場合の処理となります。 論理積と論理和は他のプログラミング言語でも当然存在します。 記述方法もほぼC言語と同じですので、 積極的に 使ってみてください。
C初級:if文で複数の条件を1度に判断する(論理積と論理和) | 電脳産物
( 5) // 120
このようにD言語ではコンパイル時用のstatic ifがあったりします. 勿論クラスや関数(UFCSの項参照)でも使えます. class Hoge (T)
T value;}
テンプレートミックスイン
単一継承のD言語では,クラス間で実装を共有する時はテンプレートを使います. template HogeImpl ()
uint hoge_;
uint hogeTwice () { return hoge_ * hoge_;}}
class A
mixin HogeImpl; // Aで定義したかのように使える}
class B
mixin HogeImpl; // 同様}
UFCS (Uniform Function Call Syntax)
第一引数をオブジェクトのように扱えるシンタックスシュガーです.2. 058までは配列のみでしたが,2. 059からintとかでも使えます. void foo (T)(T obj) {}
// 本来はfoo([1, 2, 3])とか
[ 1, 2, 3]();
5. foo();
2. 5f ();
rayやringを使った関数がthodのように呼べたのはこのためです. 例外処理
Mutex(変数m)を例に.まずはよく知られているtry - catch - finally. lock(m);
try {
// do something} finally {
unlock(m);}
スコープガード文を使った方法もあります.解放処理がとても近くなり,コードが見やすくなります. scope (exit) unlock (m); // どんな理由であれ,スコープを出る時に呼ばれる
RAIIのような方法も可能です.scopeで宣言された変数はスコープを抜ける時に破棄され,デストラクタを呼び出します. class Lock
Mutex m_;
this ( Mutex m) { m_ = m; lock(m_);}
~this () { unlock(m_);} // デストラクタは~this}
scope myLock = new Lock(m);
Range
D言語の標準ライブラリは今このコンセプトを中心に開発されています.核となるstd. rangeに満たすべきインターフェイスが定義されています.以下はstd.
志村 けん の バカウン
たとえば,以下のような乱数生成も普通にコンパイル時に動きます. ulong gen ()
Random r;
popFrontN(r, 1000);
return;}
dioにあるFileを使います.以下はコピーの例です. auto fin = File ( " "); // デフォルトは読み込み
auto fout = File ( " ", " w "); // 書き込みモードでオープン
foreach (line;)
(line);
// Fileは参照カウントで管理されているので明示的なcloseは不要
D言語の真偽値
null,false,数値型の0,まだ割り当てられていない動的配列,は偽となります.最後の配列の挙動はどうにも怪しいため,配列関係はemptyを使って評価することをオススメします. クラス
Javaと同等の機能を提供しています(単一継承です). class Person
private: // 以降はprivate
string name_;
public: // 以降はpublic
@property
// @properyをつけるとname()ではなくnameで呼び出せるようになる
//
string name () const { return name_;}
// = newName
void name ( string name) { name_ = name;}}
this ( string name) // コンストラクタはthis
name_ = name;}... } // Cなどと違い;はいらない
その他にもinterface,PODとして扱えるstructやunion,演算子オーバーロードなどもあります.また,D言語はGCを使ってメモリ管理しているため,newした後deleteする必要はありません(自らmallocなどした場合は勿論freeは必要です). テンプレート
C++よりかはすっきり書けるようになってます.以下は階乗を計算するテンプレートです. template factorial ( int n)
static if (n == 1)
enum factorial = 1;
else
enum factorial = n * factorial! (n - 1);}
/* C++などとは違い<>を使わず! ()を使う */
factorial!
indexOf( " bc "); // 見つかった場合はその位置,見つからなかった場合は-1
配列は「[]」を使います.静的配列と動的配列がありますが,よく使われる動的配列について書きます(動的配列は実はスライスだったりします.詳しくは この記事 を参照). int [] arr = [ 100, 200, 300];
宣言ではCとは違い前置形式となります. 要素の参照と代入
// 参照
a = arr[ 0];
b = arr[ 1];
c = arr[ 5]; // Error! 要素数より多いと例外が投げられる
// 代入
arr[ 0] = 1;
arr[ 1] = 2;
arr[ 5] = 5; // 参照と同じく
要素の個数
len =;
// 要素を増やす(増えた分はデフォルト値で埋められる)
+= 10;
配列の操作
rayを使うとD言語での標準的なインターフェイス(Range)が利用できます. import;
auto arr = [ 1, 2, 3];
// 先頭を取得
auto a =; // aは1
// 先頭を削除
arr. popFront(); // arrは[2, 3]
// 先頭に追加(push系がないのでinsertで)
( 0, 5); // arrは[5, 2, 3]
// 末尾を取得
auto b =; // bは3
// 末尾を削除
arr. popBack(); // arrは[5, 2]
// 末尾に追加
arr ~= 9; // arrは[5, 2, 9]
popFrontやpopBackで値が返らないのは例外安全のためです. ベクトル演算
いちいちループとか使う必要ありません.[]を使うことでベクトル演算できます. auto a = [ 1, 2, 3];
a[] += 10; // [11, 12, 13]
連想配列も「[]」を使います.キーと値を:で区切ります. int [ string] hash = [ " a ": 1, " b ": 2];
hash[ " a "] // 1
hash[ " b "] // 2
hash[ " z "] // 配列と同じく例外が投げられる
hash[ " c "] = 5
hash[ " d "] = 7
連想配列の操作
// キーの取得
hash. keys; // ["a", "b", "c", "d"]
// 値の取得
hash.
フォート ナイト 脱出 ゲーム 簡単
runオプション使うと実行ファイルなどを生成せずに実行できます. -runの依存関係解決などを強化したrdmdも同梱されています.また,--evalで簡単にコードを試せたりもします. $ rdmd foo. d
$ rdmd --eval= " writeln(10); "
整数.uがつくと符号なしになります. long num = - 1; // 符号つき
ulong num = 100_000_000; // 符号なし
浮動小数点数. double num = 1. 234;
real num = 5. 678; // ハードウェア依存(x86 CPUなら80bit)
複素数も使えたりします. creal num = 1 + 2i;
num += 3i;
writeln(, ); // reが実部(1),imが虚部(5)
この組み込み複素数はmplexで置き換えられる予定です(まだ期日は決まってません). 四則演算
// numはintとする
num = 1 + 1;
num = 1 - 1;
num = 1 * 2;
num = 5 / 2; // 2
num = 5% 2; // 1
演算子のどちらかが浮動小数点数の場合,結果も浮動小数点数になります. // numはdoubleとする
num = 5. 0 / 2; // 2. 5(numがintなどの整数型だとコンパイルエラー)
インクリメントとデクリメント
勿論あります. 文字列はダブルクォートで囲みます.ダブルクォートの中では\t(タブ)や\n(改行)などの特殊文字を利用することができます. string str1 = " abc ";
string str2 = " a \t bc \n ";
D言語での文字列は4で述べる配列の一種に過ぎません(stringはimmutable(char)[]のaliasです).またポストフィックスをつけることでリテラルの型を指定できます. string str3 = " hello " c // 各文字はchar型
wstring str4 = " hello " w // 各文字はwchar型
dstring str5 = " hello " d // 各文字はdchar型
文字列操作
// 結合
auto str = " aaa " ~ " bbb ";
// 長さ(バイト)
auto length = " abcdef ";
// 切り出し
auto substr = " abcd " [ 0.. 2]; // "ab"
/* これ以降のものはringが必要です */
// 分割
auto record = " aaa, bbb, ccc " ( ", "); // ["aaa", "bbb", "ccc"]
// 検索
auto idx = " abcd ".
rangeベースのアルゴリズムの例です. import gorithm;
auto arr = [ 1, 2, 3, 4, 5];
// 条件に合うものだけを選ぶ
filter! ( " a% 2 == 0 ")(arr); // [2, 4]
// '"a% 2 == 0"'の代わりに'a => a% 2 == 0'でもOK.delegateと文字列両方受け付ける
filter! (a => a% 2 == 0)(arr); // [2, 4]
// 条件に合うものを除く
remove! ( " a% 2 == 0 ")(arr); // [1, 3, 5]
// 加工結果をRangeで返す
map! ( " a * a ")(arr); // [1, 4, 9, 16, 25]
// 降順にソートする
sort! ( " a > b ")(arr); // [5, 4, 3, 2, 1]
基本的に,これらのアルゴリズムが返すのはarrの型ではなく,それぞれの計算を隠蔽したRangeオブジェクトです.これによって,Rangeは基本的には計算を遅延し,それぞれのRangeをつなげても,なるべく中間のオブジェクトを作らないようにしています. 配列として結果を返して欲しい時はを使います
array(map! ( " a * a ")(arr));
8で上げたFileなども含め,他のモジュールもRangeベースとなっています. 単体テスト
unittestで囲った所にテストをかけます.クラス内でも構わないので,より近くに書くのがD言語の作法です. unittest
bool foo () { /* do something */ return flag;}
assert (foo());}
これはコンパイル時にunittestオプションを渡すことで実行されるようになります. template/契約/TLS/型システムあたり含め,全然魅力を書けてない気もしますが基本ということでまぁこんな感じで許して下さい.他に詳しく知りたい方はTwitterで #dlang をつけてつぶやくか,以下のサイトを参考にしてみてください.この記事を必要であれば随時アップデートしていきます. 公式サイト
公式サイトの日本語訳
dusers: 日本でのポータルサイト
わかったつもりになるD言語 (Phobosなどに古い記述がありますが,templateなどの内容が参考になります)
本
The D Programming Language
複数の条件分岐(if..else if..else) - 条件分岐 - C言語 入門
if文で数値の比較を行う方法は、 10. 数値の比較を行う(比較演算子) で述べました。 基本は if( a > 10){ /* 実行したい処理 */} でいいのですが、プログラムを作っていくと複数の条件を1度に判断したいときが必ずやってきます。(たぶん) 例えば数値の範囲を判定したい場合です。 例)0~100までの数値ならOKで、それ以外はNG こうした判定をC言語に直す場合は、要素を一つ一つ分割して考えます。 考え方としては、こんな感じです。 1.条件を「0以上」と「100以下」に分ける 2.「0以上」でなおかつ「100以下」ならOK 3.2の条件以外はNG 面倒くさいですよね!でもこれがコンピュータに与える命令の順番(すなわちプログラム)です。 これをそのままC言語プログラムで表現してみます。 サンプルプログラム hantei. c /* hantei. c */
#include
c /* ronriseki. c */
if(n >= 0 && n <= 100){
printf("OK\n");}
だいぶスッキリとしたのではないでしょうか。 条件と条件を&&でつなぐだけです。 ちなみに条件はいくつでも追加できます。 例)aが1 かつ bが2 かつ cが3 の全てが成り立つ場合の判定 if( a == 1 && b == 2 && c == 3) これもあまり増やし過ぎるとプログラムが見にくくなりますが、使いようによっては見やすく分かりやすいプログラムが記述できます。 次は論理和を説明します。 サンプルプログラム 13if. c /* 13if. c 判定をする(AまたはB... どちらか一方が成り立つとき) */
int main(void)
{
int month;
printf("何月生まれ? ");
scanf("%d", &month);
if(month < 1 || month > 12){ /* 1より少ない、または12より大きいとき */
printf("そんな月ないでしょ!\n");}
else{ /* それ以外 */
printf("あっ!わたしと同じだ。\n");}
解説 生まれた月を入力させてメッセージを表示するプログラムです。 if文の条件では、月として存在しない数値(1未満または12をこえる数値)が入力されたときの判定をおこなっています。 したがって1から12までの月が入力された場合はelseの処理に移ります。 このように 論理和 の使い道としては、 数値が範囲外である場合を判定させたい ときなどに使うことができます。 論理積が記述した条件全てを満たさないと判定されないのに対して、論理和は、どれか一つの条件が合えば 、といった使い方ができます。 例えば年齢が0歳または100歳の人だけが対象といった場合、 if( age == 0 || age == 100) といった記述ができます。 実は、先ほどの1月から12月までの範囲を指定するような判定の場合は、論理積と論理和のどちらでも記述できます。 論理和で記述されたプログラムを論理積に直してみました。 サンプルプログラム 12if. c /* 12if. c 判定をする(AかつB... どちらも成り立つとき) */
if(month >= 1 && month <= 12){ /* 1月~12月のとき */
else{ /* 1月~12月以外のとき */
if文の処理とelse文で行うprintf関数のメッセージ内容が入れ替わっていることに気づきましたか?
D言語基礎文法最速マスター · GitHub
- クズ の 本懐 アニメ 無料
- 住吉 神社 祭り 元 住吉
- 束縛 激しい 彼氏 対処 法
- アディーレ 法律 事務 所 苦情報保
- 八ッ場ダム 現在の貯水量
- Uq スポット 天神 西 通り 福岡 県 福岡 市
- 数分前のことを忘れる 40代
- C初級:if文で複数の条件を1度に判断する(論理積と論理和) | 電脳産物
- 厚底でクッション性のある靴は身体に良くない?身体に良い靴の選び方 - あなたの身体と心をほぐすブログ
- 戦慄 かな の 狩野 英特尔
- ▷ Download Baby Panda World 【フリー】 ¡更新情報 2021!
values; // [1, 2, 5, 7]
// キーの存在確認
auto val = " a " in hash; // valには1へのポインタ,なければnull
// ハッシュのペアの削除
( " a ");
if文
if (cond) {
// do something}
if ~ else文
// do something} else {
if ~ else if 文
// do something} else if (cond) {
switch文
Cとは違い,文字列が使えたりcaseを並べて書くことが出来ます. switch (command) {
case " foo ", " bar ":
// do something
break;
case " baz ":
default:}
while文
uint i;
while (i < 5) {
++ i;}
for文
for ( uint i; i < 5; i ++) {
foreach文
配列や,opApply/Rangeインターフェイスを実装しているオブジェクトを処理出来ます. foreach (elem; arr) {
要素を弄りたかったらrefをつけます. foreach ( ref elem; arr) {
関数はCと同じようなものですが色々と指定できます.xはconstな値として入力を表し,refは参照として操作することを表します.lazyは遅延評価(zが関数内で使われるまで評価を遅延させる)を行います. nothrow void foo ( in int x, ref int y, lazy int z = 0)
{
デリゲートはネストされた関数などが該当します.これはクロージャの働きもします. uint delegate () createCounter()
uint count;
return { return ++ count;}; // {}はdelegateリテラル(引数がないので()は省略)}
auto counter = createCounter();
writeln(counter()); // 1
2. 059から以下のようなラムダシンタックスがあります. void f ( uint delegate ( uint) d)
writeln(d( 10));}
void main ()
f((x) { return x + 2;});
f(x => x + 2); // ラムダシンタックス(上のと等価)}
CTFE(Compile Time Function Excecute)
D言語ではコンパイル時に色々処理をすることが出来ます.クラスの生成も出来ますし,例外も投げれますし,もちろん数値計算や配列も操作出来ます.そのため,コンパイル時に定数を渡せば,それなりに色々な関数が動作します.