・p.57 論理型(つづき)から
p.57 論理型(再掲載)
・真理値(真偽値)を扱える型で、1ビット分の記憶容量。 ・真理値(真偽値)は真を意味するtrue、偽を意味するfalseの2値のどちらかになる ・真偽には「正しい、ホント」「間違い、ウソ」という意味はなく「あてはまる」「あてはまらない」が近い。 ・論理型はbool型のみで、trueとfalseは論理リテラル。 ※ C/C++では「整数0で偽、0以外で真を表す」ことが可能だが、C#では禁止なので注意 ・論理型変数はフラグ用に用いられることがある。例: bool tested = false; //テスト済フラグをオフ ・論理型変数はtrueとfalseの2値以外を保持できないので、フラグなどの用途に向く ・なお、Console.Write/WriteLineでbool型変数の値を表示すると先頭が大文字のTrue/Falseとなる ・bool型は.NET型ではSystem.Boolean型になる
提出フォロー:アレンジ演習:p.57 bool01.cs
・bool型変数どうしの加算をするとどうなるか確認しよう ・文法エラーになったらコメントアウトすること ・同じ2項+演算子で「文字列 + bool型変数」の場合も確認しよう
作成例
//アレンジ演習:p.57 bool01.cs
using System;
class bool01
{
public static void Main()
{
bool a = true;
bool b = false;
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("aは{0}", a.GetType());
Console.WriteLine("aは文字列にすると「{0}」", a.ToString());
Console.WriteLine("bは文字列にすると「{0}」", b.ToString());
//【以下追加】
//Console.WriteLine(a + b); //エラー(bool型どうしの加算は不可)
Console.WriteLine("x" + b); //文字列とbool型の連結は可能("xFalse"になる)
}
}
p.57 論理型:GetTypeとToString
・GetTypeの詳細はp.59にて ・bool型の変数に対して「変数.GetType()」とすると、.NET型の文字列"System.Boolean"を含むオブジェクトが返される ・Console.Write/WriteLineは文字列を含むオブジェクトを受け取ると、文字列を表示する ・ToStringの詳細はp.326にて ・bool型の変数に対して「変数.ToString()」とすると、.値がtrueならば文字"True"、falseならば文字"False"が返される ・GetTypeとToStringは論理型専用ではなく、基本的に全ての型において利用可能な仕組み
p.58 3.9 リテラル
・リテラル:ソースコードの中に記述された値のこと ・整数リテラル、実数リテラル、文字列リテラル、文字リテラル、論理リテラルがある
p.58 3.9 リテラル:整数リテラル
・整数値を表すリテラルで、10進数、8進数、16進数が利用可能 ・10進数の整数リテラル:0から9までの1つ以上の数字列で、先頭は1から9。例:123 ・8進数の整数リテラル:0から7までの1つ以上の数字列で、先頭に0を付ける。。例:0123 ・16進数の整数リテラル:0から9とAからFまでの1つ以上の数字列(小文字可)で、先頭に0xを付ける。例:0x1AF ・サフィックス(接尾語)をつけないとint型扱いになる ・サフィックスLまたはlを末尾につけるとlong型扱いになる(※通常「l」は非推奨) ・サフィックスUまたはuを末尾につけるとuint型扱いになる ・サフィックスULまたはulを末尾につけるとulong型扱いになる ・なお、sbyte、byte、short、ushort型扱いを示すサフィックスはない ・サフィックスをつけない整数リテラルが、int型の範囲である±約21億を超えてもエラーにならない。 ⇒自動的に、uint、long、ulongの順に範囲チェックを行い、最初に該当した型で扱われる 例: 2200000000⇒uint型扱い、-2200000000⇒long型扱い
p.58 3.9 リテラル:実数リテラル
・実数値を表すリテラルで、通常表記、指数表記(●E±■)が可能。10進数のみ。 ・サフィックス(接尾語)をつけないとdouble型扱いになる(サフィックスDまたはdを指定可だが、推奨されない場合がある) ・サフィックスFまたはfを末尾につけるとfloat型扱いになる ・サフィックスMまたはmを末尾につけるとdecimal型扱いになる
p.58 3.9 リテラル:補足:文字リテラル
・文字を表すリテラルで、シングルコーテーションで1文字を囲んだもの。半角文字、全角文字、エスケープ文字(p.55)を利用可能 ・文字リテラルはchar型扱いになる ・内部的には文字コード(番号)が格納されているので、後述するキャストによって文字コード(番号)を得たり、 文字コード(番号)に該当する文字を得ることが可能
p.58 3.9 リテラル:補足:文字列リテラル
・文字列を表すリテラルで、ダブルコーテーションで0文字以上の文字の列を囲んだもの。エスケープ文字を含む全ての文字を利用可能 ・文字列リテラルはstring型扱いになる
p.58 3.9 リテラル:補足:論理リテラル
・真偽を表すリテラルで、trueとfalseのみ ・論理リテラルはbool型扱いになる ・内部的には1ビットの情報量だが、0/1で表すことはできないので、後述するキャストによっても整数/実数型には変換できない (C/C++とは異なる)
p.58 3.9 リテラル:GetTypeの詳細
・GetTypeメソッドはObjectクラスに含まれるもので、Objectクラスは暗黙的に全てのクラスの基本クラスとなっているので、 全クラスにおいてObjectクラスのもつメソッドが実行可能 ・そして、リテラルはそれぞれの該当する型を表す.NET型を示す構造体(p.275)のオブジェクトとみなされる ・GetTypeメソッドは.NET型を示す構造体をまとめているTypeクラスで扱えるオブジェクトを得て返す仕組み ・このオブジェクトの中に、.NET型を表す文字列が格納されている ・bool型の変数に対して「変数.GetType()」とすると、.NET型の文字列"System.Boolean"を含むオブジェクトが返されるように、 すべての変数に対して型を表す文字列を得ることができる。 ・なお、リテラルの場合も同様で「リテラル.GetType()」とすると、リテラルを扱う型を表す文字列を得ることができる。 例:100.GetType() ⇒ System.Int32 が得られる 例:100U.GetType() ⇒ System.UInt32 が得られる
p.60 literal01.cs:形式指定文字列の使いまわし
・Console.Write/WriteLineで利用する形式指定文字列は、文字列型の変数に格納して使いまわすことができる
・例: string s = "{0}倍"; Console.WriteLine(s, 3); //「3倍」と表示
アレンジ演習:p.60 literal01.cs
・整数リテラル2200000000の型情報を表示しよう(22億) ・整数リテラル-2200000000の型情報を表示しよう(-22億) ・実数リテラル3.14E+3の型情報を表示しよう(3140だが…) ・文字リテラル、文字列リテラル、論理リテラルの型情報を表示しよう
作成例
//p.60 literal01.cs
using System;
class literal01
{
public static void Main()
{
string format = "{0}の型は.NET型で{1}です";
Console.WriteLine(format, "100", 100.GetType()); //System.Int32
Console.WriteLine(format, "100U", 100U.GetType()); //System.UInt32
Console.WriteLine(format, "100L", 100L.GetType()); //System.Int64
Console.WriteLine(format, "100UL", 100UL.GetType()); //System.UInt64
Console.WriteLine(format, "1.25", 1.25.GetType()); //System.Double
Console.WriteLine(format, "1.25F", 1.25F.GetType()); //System.Single
Console.WriteLine(format, "1.25M", 1.25M.GetType()); //System.Decimal
Console.WriteLine();
Console.WriteLine(format, "10F", 10F.GetType()); //System.Single
Console.WriteLine(format, "10D", 10D.GetType()); //System.Double
Console.WriteLine(format, "10M", 10M.GetType()); //System.Decimal
Console.WriteLine();
Console.WriteLine(format, "-10D", (-10D).GetType()); //System.Double
//【以下追加】
Console.WriteLine(format, "2200000000", 2200000000.GetType()); //System.UInt32
Console.WriteLine(format, "-2200000000", (-2200000000).GetType()); //System.Int64
Console.WriteLine(format, "3.14E+3", 3.14E+3.GetType()); //System.Double
Console.WriteLine(format, "文字A", 'A'.GetType()); //System.Char
Console.WriteLine(format, "文字列ABC", "ABC".GetType()); //System.String
Console.WriteLine(format, "true", true.GetType()); //System.Boolean
}
}
p.61 3.10 暗黙の型指定
・C#バージョン3.0以降において、初期化によって型が類推できる変数では、型を省略可能になった ※ VS2022のC#のバージョンは11.0(最新内部バージョンでは13.0) ・この型がvarで、var型、または、varキーワードによる暗黙の型指定という ・定義書式: var 変数名 = 初期値; //型が類推できる初期値による初期化が必須 例: var a = 10; //aはint型扱いになる
アレンジ演習:p.62 var01.cs
・定義済のvar型変数に、同じ型や、異なる型の値を代入するとどうなるか確認しよう。 ・【注記】Mainメソッドの戻り値型がvoidではなくintになり「return 0;」が追記されているが、この場合、必要性はないので、 これまでの形式で良い。 ※これは、プログラムを呼び出した対象(例:OSや親システム)に実行結果を返したい場合の記述方法。
作成例
//アレンジ演習:p.62 var01.cs
using System;
class var01
{
public static void Main()
{
var mytext = "猫でもわかるC#プログラミング 第"; //string
var no = 3; //int
var myc = '版'; //char
Console.WriteLine(mytext + no + myc);
Console.WriteLine("mytextの型は{0}で、noの型は{1}で、mycの型は{2}です",
mytext.GetType(), no.GetType(), myc.GetType()); //System.String, System.Int32, System.Char
//【以下追加】
no = 4; //int型扱いのnoに4を代入できる
Console.WriteLine(mytext + no + myc);
//myc = ".0版"; //char型扱いのmycに文字列は代入できない(文法エラー)
}
}