# WEEK 1 8/17~8/21 彙整
## 主要內容:陣列1維及多維,基礎函式,運算子順序,三元運算寫法
### 了解基礎 記憶體位置
* 變數初始值 或設定為null 在java中 實際值為0
* 參考變數(arr[0]) 初始為null
* 部分(arr)會顯示為 型態+記憶體位置
```java=
Scanner sc = new Scanner(System.in); //在heap配置了Scanner,位址存於stack內的sc內
Scanner[] arr = new Scanner[5]; //在heap配置 5個Scanner的類別用來存scanner的位置
arr[0] = sc; //將位於stack的sc的值,儲存到位於heap內的arr[0]的位置
```
* 二維陣列
* 第一階在stack 存位址,實際陣列位於heap
* 位於heap的陣列,儲存第二維的位置,資料位於另外的heap位址
```java=
int[][] arr = new int[3][3];
arr[0]=arr[1]; //將arr[1]內存的"位址",儲存到arr[0]內
arr[0][0] = 1; //此時 arr[1][0] 是同一個記憶體位置內存值
arr[0][1] = 2; //此時 arr[1][1] 是同一個記憶體位置內存值
java可動態調整array長度!!
int[][] arr = new int[3][];
for(int i=0;i<3;i++){
arr[i] = new int[i+1]; //創建不同長度的第二階陣列
for(int j=0;j<i+1;j++){
arr[i][j]=j+1; //賦值
}
}
for(int i=0;i<3;i++){
for(int j=0;j<i+1;j++){
System.out.println(arr[i][j]); //印出
}
}
```
* 長度不同的矩陣長度列印
```java=
int[][] arr = { {1,2,3},{4,5}};
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
//執行動作
}
}
```
---
### 運算子++ 跟- - 的先後順序
運算 等號右邊先算 再放入左值
優先順序 1.從左到右 2.遇到括弧 先算
```java=
1.int a=4, b=3;
a= (a++ -b)*a;
```
先運算等號 右邊第一個a++ 為後++ 本質不變但下一個出現的a
因為暫存值(a++變為5)
故(4-3)*5 =5
///////////////////////////////////////////////
```java=
1.int a=4, b=3;
a= (a* ++b)/--a;
```
++ b為先++ --a為先--
故 從左到右 (4*4)/3 =5.xxxx
a為int故為5
```java=
1.int a=4, b=3;
a= ((--a *b++)/ (a* --b));
```
3*3 b++(暫存為4) /3*3 (又被- -b扣掉)
=1
---
## 三元運算子 寫法
接收的數值 =(判斷true or false的結果) ? true(會傳的數值) : false (會傳的數值);
三個數值都一樣
ex int a = (true) ? int b : int c;
這樣a會等於b
---
## foreach寫法
```java=
int[] arr ={1,2,3,4};
for(int i : arr){
...... //他就會從arr第一位取到最後一位 不斷放入變數 i中 一直到重覆到陣列長度
}
```
---
## 函式
變數 及 行為
main 主程式的開始
函式主要是一個方法
例如:
int a =sc.nextInt(); 用. 進入nextInt
方法用完後將回傳值帶回給sc
然後放入int a裡面
用上void 後 將不會有回傳值
void位置 可以用其他型態取代位置例如
int double ...等
而他的後面 放 自己取的名稱
例如
public static void abc(){
}
() 裡面用, 做區隔
裡面可放任何型態(參考資料 基本資料) 可以一樣也可以不一樣
例如
public static void abc(int test1,int test2){
}
如果不是void 是其他型態例如
public static int abc(int a){
return 1; //要有回傳值(要注意回傳型態是否相同)
}
函式的(int a) 是指這個函式方法被創立的時候新建的
int a;
當離開這個方法時,他生命週期就結束了
跟main裡面的 int a 是不同個位置
```java=
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
test();//執行下方函式(方法)
}
public static void/*方法的回傳值*/ test() /*方法名稱(型態 參數1名稱,型態 參數2名稱)*/ {
System.out.println("!")
}
```
* 回傳值 只能選一個型態(例如選了int 就不能回傳double)或不傳(viod)
* 傳入值 可以很多個各種不同型態
* 函式運作思路 : main主程式內跟函式是不同記憶空間,並不相連
要藉由傳入值 傳進函式 及 回傳值(return) 才能將資料給予彼此對方
* main函式內變數,與函式內可重複名稱,因函式內的名稱生命週期,僅在該函式內。
---
java 僅 call by value
另有 call by reference 及 call by address(限台灣)
```java=
public class Main{
public static void main(String[] args){
//Scanner sc = new Scanner(System.in);
int a = 5;
test(a);//執行下方函式(方法)
System.out.println(a); //外部 a 未被變更 印出5
int[] b = new int[1];
b[0]=5;
System.out.println(b[0]); //位址指向的 b[0]資料被變更 印出1
}
/*下方的函式 int a , int[] b*/
public static void test(int a,int[] b){
a += 1;
b[0]=1;
}
```
* 目前唯一有辦法不回傳值,修改到內容,只能從地址修改
假設有int[] a,int[] b 不同陣列,但儲存資料為同一個記憶體位址,
修改其中一個內容,另外一個也會跟著被改,因為是共用記憶體位址