顯示具有 冷知識 標籤的文章。 顯示所有文章
顯示具有 冷知識 標籤的文章。 顯示所有文章

2018年5月15日 星期二

C++曾經新手犯過的可執行錯誤-vector兩層寫法

int m=0,n=0;
cin>>m>>n;

vector<vector<int> > map;//預設兩層陣列
/*兩個 ">>" 之間一定要隔開*/

//將資料讀入兩層陣列
//寫法 1
for (in t i = 0; i < m; i++)
{
  vector<int> tmp(n, 0);// 宣 告一暫時的內層向量,n 為個數,0為預寫入資料
  for (int j = 0; j < n; j++)//內層向量先將資料一排逐一讀入
  cin >> tmp[j];
  map.push_back(tmp);/ /再推入外層向量
}

//寫法 2
for(int i=0;i<m;i++)
{
  vector<int> ma;// 宣告一暫時的內層向量
  map.push_back(ma);//先推入外層向量
  for(int j=0;j<n;j++)
  {
  int a=0;//宣告一整數
  cin>>a;//讀入
  map[i].push_back(a);//再進行推入向量
/*注意到該寫法,不再使用內層向量,而是使用外層向量的元素作指定*/
  }
}

2018年3月18日 星期日

C++冷知識~~~while、括號與逗點

C++冷知識~~~

#include<iostream>
using namespace std;
int main()
{
        int a,b;
        a=1,2,3,4,5;//輸出第一個值, a=1;
        b=(1,2,3,4,5);//輸出最後一個值, a=5;
        cout<<a<<endl;
        cout<<b<<endl;
     
        int c[10]={1,2,3,4,5,6,7,8,9,0},b=10;
        while(b --> 0)cout <<c[b]<<" ";//輸出0 9 8 7 6 5 4 3 2 1 ;
        cout<<endl;
        int d=10;
        while(d --> 0)cout <<d<<" ";//輸出9 8 7 6 5 4 3 2 1 0;
        return 0;
}

2018年3月17日 星期六

C++曾經新手犯過的可執行錯誤

是否在剛學習宣告變數時,想要使用了那些懶人包( a=a+1 改成 a+=1 或 ++a );😙😙

但應用上輸出結果卻時常不如預期,不知道錯在哪裡;😕😖

誤打誤撞的對了,也就這樣了,對於同樣錯誤的隔壁;😓😒😑😐

兩兩互看、四目對望的也不知道錯在哪;😵😵

即便改對了,完全像作夢似的完全不記得夢境內容,說不出個所以然;😭😣😱

既是交不了作業覺得煩躁又覺得程式困難重重,大大的打擊信心(桑勳~~);😬💔💢💣

以下示範了這些懶人包(這些可執行的寫法),靜靜的思考一下,搞清楚;😤😤😤

弄懂了,搞不好在其他地方 ,也能運用呢,也可以自行執行看看喔~~!;😀😀😀

#include<iostream>
using namespace std;
int main()
{
int a = 1 , b = 0 ;

b=a++;//先執行 b=a 後 a++(即a=a+1),a=2 b=1

cout << a <<endl;// a=2
cout << b <<endl;// b=1

cout << a++ <<endl;//a會先傳回原來的2,但實際上a=a+1, a=3

a++;//a=a+1, a=4

cout << a++ <<endl;//a會先傳回原來的4,但實際上a=a+1, a=5
cout << +a <<endl;//無運算, 保持不變 a=5
cout << ++a <<endl;//a=a+1, a=6

b=++a;//b= (a=a+1), a=7 b=7

cout << a <<endl;//保持不變, a=7
cout << b <<endl;//保持不變, b=7
cout << ++b <<endl;//b=b+1, b=8
cout << b++ <<endl;//b會先傳回原來的7,但實際上b=b+1, b=8

++a;//a=a+1, a=8

cout << a <<endl;//保持不變, a=8

//👉💭 a++ 在運算子裡面的優先等級高於 ++a 喔~~~ 💭👈

cout << a++ + ++a << endl;

//a會先更新為 a++ 傳回的 8 (實際上a=a+1, a=9)加上

//實際的 a=9 (a=a+1, a=10), 故b=8+10, a=18

cout << a << endl;// a=10
cout << ++b + b++ << endl;

//雖然會先傳回 b=9(但之後繼續參與運算的是實際上的b=b+1, b=10)

//加上剛被前算式 b++ 更新的 b=10, b=10+10=20,然後再進行 ++b, b=b+1, b=21

cout << b << endl;// b=11

return 0;
}

2017年11月26日 星期日

兩值互換

在C++
int x=3,y=4;
x^=y^=x^=y;
會讓兩變數的值交換;
即x=4,y=3;
在Java
int x=3,y=4;
x^=y^=x^=y;
卻僅能一位換過去而已;
即x=4;
而另一個y呢?
卻會變成y=7;(咦?
這是基於兩者計算順序上的不同導致的結果~~
C++是整個"由右往左";......<=
Java是整個"由左往右";.....=>
花點時間實際自己做一次,就會理解了~

註:
^=
是將兩數進行 XOR 運算(^);
並且將結果存到左方的變數(=);
XOR
翻譯為"兩數在二進位下,逐一比對同位置的位元;
是否 \\不一樣\\ ;
另一解釋或記法為,[相同則0,相異則1];