🙆

プログラミング自主学習 28日目 コンソルで変数の値出力/演算子

2023/06/23に公開

コンソルで変数の値出力

printf

printf("%[argument_index$], [flags] [width], [.precision] conversion", 変数あるいは値)

flags:

- : 左に整列、右は空白
0:空白を0に埋める
+:+、-符号出力
, : 整数の3桁で,を付ける。

conversion:

%d : 10進法整数
%o : 8進法整数
%x : 16進法整数
%f : 実数
%e : 指数
%b : boolean
%c : 文字
%s : String
%n : どのOSでも改行(windowは実は\r\nだけど\nに見えるようだ)

package ch02.sec12;
 
public class PrintfExample2 {
public static void main(String[] args) {

int number = 10;
double score = 12.345;
String text = String.valueOf(number);

System.out.printf("%b %n", 3<1); //boolean
System.out.printf("%d %n", number); //decimal
System.out.printf("%o %n", number); //octal
System.out.printf("%x %n%n", number); //hexadecimal

System.out.printf("%,d %n", 10000000); //decimal
System.out.printf("%+d %n", number); //decimal
System.out.printf("%+d %n", -number); //decimal

System.out.printf("%f %n", score); // 浮動小数点(floating point)
System.out.printf("%e %n%n", score); // 指数(exponent)

System.out.printf("%c %n",65); //char(UNICODE)
System.out.printf("%s %n%n", text); //String

System.out.printf("[%10d] %n", number);
System.out.printf("[%-10d] %n", number);
System.out.printf("[%010d] %n", number);
System.out.printf("[%10.5f] %n", score);
System.out.printf("[%010.5f] %n", score);

   }

}
[result]
false
10
12
a
 
10,000,000
+10
-10

12.345000
1.234500e+01

A
10

[ 10]
[10 ]
[0000000010]
[ 12.34500]
[0012.34500]

Scanner

コンソールに文字列リテラルを入力して、それを持つことができる。

Scanner scanner = new Scanner(System.in);
String inputData = scanner.nextline();

close();     //必ず

符号演算子

+: 被演算子の符号を維持。
-: 被演算子の符号を変更。

変数の演算は基本的にintに変換されてから実行されるため、

byte b =100; byte result = -b; <ーエラー
byte b =100; int result = =b; <ー OK

増減演算子

++(--)被演算子 : 被演算子の値を1増加(減少)させる。
被演算子++(--) : 他の演算を実施した後被演算子の値を1増加(減少)させる。

int x = 1; int y = 1;
int result 1 = ++x + 10;    -> int result1 = 2 + 10;   12
int result 2 = y++ + 10;    -> int result2 = int result2 = 1+10; -> yを1増加  11

最終的にxとyは2になる。

算術演算子

1)OVERFLOWとUNDERFLOWを気を付ける。

int a = 1000000; 
int b = 1000000; 
int result = a*b  //  -> 演算の値がOVERFLOWのため-72739968;発生。

long a =1000000; 
long b=1000000;  
long result = a*b // -> 1000000000000

MAX_VALUE:最大値、MIN_VALUE:最小値

2)正確な演算は整数を使う。

コンピューターは実数を保存する際に、2進法で変換して、保存する。
0.125の場合は2進法で分けて表現できるが、

0.1の場合は0.00011001 100110001 100110001 100110001 100110001 100110001 100110001 のように仮数のところが無限に繰り返される。

これは24bitの仮数(mantisa)を保存するfloatにも52bitのmantisaを保存するdoubleにも完璧にこめることができないため、精密度の損失が発生する。

なので、0.1+0.2==0.3はfalseになる。

お金のように誤差があればいけないものは整数もしくはBigDecimalなどを活用する。

Discussion