プログラム言語 データ型

変数(データ型)宣言

型推論(object型ではない)
var i = 5;
i="5" →エラー
型推論を利用した変数宣言では同時にに初期化が必要で、初期化時の型以外の型を格納できない。
型推論を利用したクラスのインスタンス化は「オブジェクト指向: クラス/インスタンス化」参照

int i = 5;
string i = '5';
object i = 5;

private int i = 5;
public string i = ‘5’;
protected object i = 5;

Dim i As Integer = 5
Dim i As String = '5'
Dim i As object = 5

Private i As Integer = 5
Public i As String = '5'
Protected i As object = 5

int i,j,k;
int i = 100;

//variant型
var i = 5;

//宣言なしでの使用も可(非推奨)
i = "5";

// 関数も格納できる。
i = function(){ ~ };
// 関数の実行。
i;

宣言無しで使用可
型定義無し(型推論=初期値に応じて自動的に定義される)
$i = "5";
$i = 5;

変数の初期化
unset($i);
print $i;
→(何も表示されない)

my $X;
my $y = "bbb";
my @z = (c,c,c);

//宣言なしでの使用も可(非推奨)
$yy = "bbb";

宣言無しで使用可
型定義無し(型推論=初期値に応じて自動的に定義される)
i="5";
i=5;
=の前後に を入れない

読取専用
readonly i=~;

変数削除
unset i

変数の参照
echo $i
echo {$i}

標準出力結果を代入
$i=`~`
「`」はSHIFT+@
例 $i=`ls`

データ型一覧

種類 格納先
・基本型
(値型、プリミティブ型)
・論理型(boolean)
・文字型(char)
・整数型(short、int、long)
・小数点型(float、double)
・空型(void)
構造体
列挙体
スタック領域
参照型
(オブジェクト型)
・文字列型(String ※言語による)
・配列
・クラス
・インターフェイス
・デリゲート
ヒープ領域

String name1 = "Hello";
String name2 = new String("Hello");
※文字列の値が等しいか?
boolean blnRet = name1.equals(name2);
⇒ blnRet : true
※参照値が等しいか?
boolean blnRet = (name1 == name2);
⇒ blnRet : false
文字列型の参照/値型と参照型」参照

signed ~ 符号(+-)有。デフォルト:有
unsigned ~

signed short int -32,768 ~ 32,767
unsigned short int 0 ~ 65,535
short int -32,678 ~ 32,767
int -2,147,486,948 ~ 2,147,483,647

__int8 my_Int1 = -128;
__int8 my_Int2 = -129;
// my_Int2:127


unsigned __int8 my_Int3 = 255;
unsigned __int8 my_Int4 = 256;
// my_Int4:0

unsigned __int8 my_Int5 = -1;
// my_Int5:255


char myChar1 = 'a';
char myChar2 = 'aa';
// myChar2:'a'


signed char myChar3 = -128;
signed char myChar4 = -129;
// myChar4:127

signed char myChar5 = 127;
signed char myChar6 = 128;
// myChar6:-128


unsigned char myChar7 = 255;
unsigned char myChar8 = 256;
// myChar8:0

unsigned char myChar9 = -1;
// myChar9:255


wchar_t myWcharT1 = 'aaa';
wchar_t myWcharT2 = '西';
wchar_t myWcharT3 = '西宮';

bool myBool1 = true;
bool myBool2 = -1;
// myBool2:true

論理値(論理型)
boolean

整数(整数型)
integer

浮動小数点数(浮動小数点型)
float(double)

文字列

string

配列
array

リソース
resource

ヌル値
NULL

データ型別名

unsigned long int i = 1000000000;

typedef unsigned long int newInt;
newInt n = i;

将来的にデータ型を変更する可能性がある場合、
別名型を使用しておくと、一カ所の変更で全ての別名型のデータ型を変更できる。

真/偽

真偽に当たる型や組み込み変数はない。
真偽は以下で表現する。

false
'0' #文字列としての'0'
'' #Null文字列
"" #Null文字列
未定義

my $str;
if($str){
  print "未定義","\n";
}elseif($str eq "aaa"){
  ~
}

true
my $str = 0;
if ($str){
  print "定義済み","\n";
}

文字型、文字列型

プログラム言語 データ型:文字型・文字列型」参照

C#、JAVAにおける文字列型の挙動については、「文字列型の参照」参照

固定の値

定数/固定値

【定数】:プリプロセッサにより、コンパイル前に置き換えられる。
データ型は自動判別される。

オブジェクト型マクロ定数
#define DEF_NUM (5)
#define DEF_STR ("AAA")

関数型マクロ定数
#define DEF_FUNC(a) ( (DEF_NUM + a) )

Console::WriteLine(DEF_NUM);
→ 5
Console::WriteLine(DEF_STR);
→ AAA
Console::WriteLine(DEF_FUNC(10));
→ 15

【固定値】
const int CONST_MYINT = 5;
const string CONST_MYSTR = "AAA";

CONST_MYINT = 10;
// エラー

※関数ポインタにおいてメモリアドレスを変更されたくない場合の使い方
void myFunc(const int *prm){}

define("CONST_TEISUU", "定数");

print CONST_TEISUU;
→定数

列挙体(enum)

enum enmTest1
{
  enum1,
  enum2,
  enum3
}

enum enmTest2
{
  enum1 = 1,
  enum2 = 2,
  enum3 = 3
}

enum enmTest3
{
  enum1 = "1",
  enum2 = "2",
  enum3 = "3"
}

public void myForm_Load(object sender, EventArgs e)
{
  SubRoutine(test1: enmTest1.enum1,
         test2: enmTest2.enum1,
         test3: enmTest3.enum3);
}

private void SubRoutine(enmTest1 test1,
             enmTest2 test2,
             enmTest3 test3)
{
 ~
}

Private Enum enmTest1
  enum1
  enum2
  enum3
End Enum

Private Enum enmTest2
  enum1 = 1
  enum2 = 2
  enum3 = 3
End Enum

VBでは文字列を設定する事はできない

Private Enum enmTest3
  enum1 = "1"
  enum2 = "2"
  enum3 = "3"
End Enum


Private Sub myForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load

  Call SubRoutine(test1:=enmTest1.enum1, _
              test2:=enmTest2.enum1)

End Sub

Private Sub SubRoutine(ByVal test1 As enmTest1, _
                  ByVal test2 As enmTest2)
 ~
End Sub

enum myEnum
{
  value1 = 0,
  value2 = 1,
  value3
};

int myInt = myEnum::value1;
※int型変数へ格納可能

Console::WriteLine(myInt);
// ⇒0
return 0;

package myPackage;

public class MyEnum {
 public enum VALUE{
  VAL1,
  VAL2,
  VAL3
 }
}

import static myPackage.MyEnum.VALUE.*;

public class MyMain {
 public static void main(String[] args) {
  int intVal1 = VAL1.ordinal();
  自動的に使用できるメソッド(正確にはMyEnumが自動的に継承するenumクラスのメソッド)
  → 0
  String strVal1 = VAL1.name();
  自動的に使用できるメソッド(正確にはMyEnumが自動的に継承するenumクラスのメソッド)
  → VAL1
 }
}

【独自メソッドを定義】
package myPackage;

public class MyEnum {
 public enum custEnum{
  intVAL1(1, "name1"),
  intVAL2(2, "name2"),
  intVAL3(3, "name3"); ←!
  メソッドを作成する場合は「;」で終わる
  下部のコンストラクタを呼び出す

  
  private final int index;
  private final String name;
  セッターを作成しない場合は「final」
  
  内部からのみ呼び出されるコンストラクタ

  custEnum(int index, String name){
   this.index = index;
   this.name = name;
  }
  外部から呼び出されるメソッド

  public int getIndex() {
   return this.index;
  }
  外部から呼び出されるメソッド

  public String getMyName() {
   return this.name;
  }
 }
}

import static myPackage.MyEnum.custEnum.*;

public class MyMain {
 public static void main(String[] args) {
  int intVal = VAL1.getIndex();
  → 1

  intVal = VAL1.ordinal(); も○
  → 0

  
  String strVal = VAL1.getMyName();
  → name1

  strVal = VAL1.name(); も○
  → Val1

 }
}

var enmState = {
  Stop: 0,
  Moving: 1,
  End: 2
};
var gState = enmState.Stop;
const INDEX = [
  'IDX1' => 0,
  'IDX2' => 1,
  'IDX3' => 2,
];

$ary = ['php', 'java', 'C#',];
echo $ary[INDEX['IDX1']];
→php

リテラル

ソースコードに直接記述された変数、定数以外の値。
リテラル領域という変数等とは異なるメモリ領域に作成される。
(C#、JAVAにおけるリテラル値の参照については、「文字列型の参照」参照)
文字列リテラルを記述する場合はエスケープ処理の防止を考慮する必要がある。
(「エスケープ」参照)

Console.WriteLine("C:\test\test.txt");
//⇒ C:    est    est.txt
//⇒ C:[tab]est[tab]est.txt
タブ入力を意味する特殊文字「\t」と見なされている。

Console.WriteLine(@"C:\test\test.txt");
//⇒ C:\test\test.txt
「@」を付けるとエスケープ処理されない。

Console.WriteLine("C:\\test\\test.txt");
//⇒ C:\test\test.txt

「@」を付けない場合。
「\」の前に更に「\」を付ける。

リテラル
String myStr = "5"; //文字列リテラル
int myInt = 5; //整数リテラル
double myDoublt = 5.0; //浮動小数点リテラル
Boolean myBool = true; //真偽リテラル

リテラルにおける型の明示(接尾辞)
long myLong = 5L(または5.0l);
⇒ myLong : 5
float myFloat = 5F(または5f);
⇒ myFloat : 5.0

int myInt = 10F; ⇒エラー

整数リテラルの他基数表示
int myInt = 10; //10進数
int myInt = 010; //8進数
int myInt = 0x10; //16進数
int myInt = 0b10; //2進数

「_」(アンダースコア)
整数リテラルを読みやすくする為の記号
int a = 123_456_789;

使用ルール
・リテラルの先頭と末尾には記述できない
・記号の前後には記述できない

echo関数による文字列の出力
<?php
 echo "aaaaa<br />\n";
 echo "bbbbb<br />\n";
 ↓ リテラルへのphp変数の埋め込み
 「プログラム言語 標準関数(テキスト系)/バインド(埋め込み)」参照
?>

html文字中へphp埋め込み
<p>
 aaaaa<br />
 bbbbb<br />
 ccc<?php echo $purpose; ?>ccc<br />
 <a href="test.php">ddd<a>
</p>

ヒアドキュメント
\n無しで改行、特殊文字のエスケープ不要
<<< がヒアドキュメントの開始合図
<<< の次に書いた文字が再度出現するまで全て出力される

<p>
 <?php
  $purpose = "ppp";
  
  echo <<< HERE
  aaaaa<br />
  bbbbb<br />
  ↓ リテラルへのphp変数の埋め込み
  ccc{$purpose}ccc<br />
  <a href="test.php">ddd<a>
  HERE;
 ?>
</p>

結果
aaaaa
bbbbb
cccpppccc
ddd

Object型

<div id="hoge">~</div>

JavaScript
var hoge = document.getElementById('hoge');
hoge.~ = ~

jQuery
var hoge = $("#hoge").get(0);
var hoge = $("#hoge")[0];
hoge.~ = ~

全ての型(class)はObjectクラスを継承している為、
Objectクラスのメソッドは全クラスで使用可能。
オブジェクト指向: ポリモーフィズム/型情報」参照

構造体

構造体:値型
クラス:参照型

struct MyStruct
{
 public int myInt;
 public string myStr;
 
 public MyStruct(int prmInt, string prmStr)
 {
  this.myInt = prmInt;
  this.myStr = prmStr;
 }
 public int fnPlus() { return this.myInt * 2; }
 public string fnPlus(string prm) { return this.myStr + prm; }
}

class Program
{
 static void Main(string[] args)
 {
  int retInt;
  string retStr;
  
  MyStruct m1 = new MyStruct();
  retInt = m1.fnPlus();
  retInt:0
  retStr = m1.fnPlus(prm: @"bbb");
  retStr:bbb
  デフォルトコンストラクタが呼ばれると変数のデフォルト値で初期化される(int:0、string:null)
  
  MyStruct m2 = new MyStruct(prmInt: 10, prmStr: @"aaa");
  retInt = m2.fnPlus();
  retInt:20
  retStr = m2.fnPlus(prm: @"bbb");
  retStr:aaabbb
  
  MyStruct m3;
  retInt = m3.myInt; コンパイルエラー
  retStr = m3.myStr; コンパイルエラー

 }
}

int main(array<System::String ^> ^args)
{
  struct person
  {
    char *name;
    int age;
  };
  
  person p;
  p.age = 36;
  Console::WriteLine(p.age);
  
  return 0;
}

※構造体定義に続いて変数定義
int main(array<System::String ^> ^args)
{
  struct person
  {
    char *name;
    int age;
  } p;
  
  p.age = 36;
  Console::WriteLine(p.age);
  
  return 0;
}

Private Type tpType
 A As Integer
 B As String
End Type

Dim myType() As tpType
ReDim myType(5)

Dim i As Integer
For i = 0 To UBound(myType) ※i=0To5
 myType(i).A = i
 myType(i).B = "B"
Next i

部分型

クラス、構造体について記述を分割できる。
別ファイルへの記述も可。
大規模開発時等に利用される。

public partial class MyClass
{
 private int _member1 { get; set;}
}

public partial class MyClass
{
 private int _member2 { get; set; }
}

public partial class MyClass
{
 public MyClass(int mem1, int mem2)
 {
  this._member1 = mem1;
  this._member2 = mem2;
 }
 public int retPlus()
 {
  return this._member1 + this._member2;
 }
}

public partial class _Default : Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
  MyClass myClass = new MyClass(mem1:5, mem2:10);
  int ret = myClass.retPlus();
  ret:15
 }
}