C:\SVN\book\C\blog>cat even-1.c #include// 程式將 i 調整為偶數後再乘以 5 int main() { int i = 3; // 檢驗 i 是否為奇數 if (i % 2 == 1) // 沒失敗 i++; i *= 5; // 變成偶數後再乘以 5 printf("%d\n", i); } C:\SVN\book\C\blog>gcc even-1.c C:\SVN\book\C\blog>a.exe 20
2011年8月6日 星期六
4 * 5 = 20
4 * 5 = 15
C:\SVN\book\C\blog>cat even.c #include// 程式將 i 調整為偶數後再乘以 5 int main() { int i = 3; // 檢驗 i 是否為奇數 if (i % 2 == 1) // 成功 i++; i *= 5; // 變成偶數後再乘以 5 printf("%d\n", i); } C:\SVN\book\C\blog>gcc even.c C:\SVN\book\C\blog>a.exe 15
2011年8月4日 星期四
1 & 3 != 0
int main() { char i = 1; char j = 3; if (i & j) printf("yes.\n"); else printf("no.\n"); return 0; }
Output
yes.
1 & 3 == 0
int main() { char i = 1; char j; scanf("%d", &j); if (i & j) printf("yes.\n"); else printf("no.\n"); return 0; }
Input
3
Output
no.
2011年6月22日 星期三
補救的機會
期末常遇到學生來求情,所以P老師準備了以下說詞。
問題:老師我因為種種原因導致成績不及格,有沒有補救的機會?
答案:
短版本:沒有
長版本:沒有。成績的計算是作業xx%,考試yy%,其他因素0%。其他因素包括外務太多,會被二一,時間管理不當等等。我會這樣說並不是想耍酷,而是因為我想盡量把成績計算單純化,公平化。否則要考慮的因素太多,不單純,也不公平。成績計算就是反映你的學習成效,最單純公平的辦法就是看作業和考試。這是我的信念 ,也是我對這個問題的答案。
問題:老師我因為種種原因導致成績不及格,有沒有補救的機會?
答案:
短版本:沒有
長版本:沒有。成績的計算是作業xx%,考試yy%,其他因素0%。其他因素包括外務太多,會被二一,時間管理不當等等。我會這樣說並不是想耍酷,而是因為我想盡量把成績計算單純化,公平化。否則要考慮的因素太多,不單純,也不公平。成績計算就是反映你的學習成效,最單純公平的辦法就是看作業和考試。這是我的信念 ,也是我對這個問題的答案。
2011年3月23日 星期三
Old memories never disappear, they just change.
int *bar(int t) { int i = t; int *temp = &i; printf("temp is %d, (*temp) is %d\n", temp, *temp); return temp; } void foo(int a, int b, int c) { int i = 40; } int main() { int *a; a = bar(10); printf("a is %d, (*a) is %d \n", a, *a); foo(10, 20, 30); printf("a is %d, (*a) is %d \n", a, *a); }
The output.
temp is 2686740, (*temp) is 10 a is 2686740, (*a) is 10 a is 2686740, (*a) is 40
2011年3月13日 星期日
Beware of typos
#include <stdio.h>
int main()
{
int type = 10;
int i =10;
switch (type) {
case 1:
i = 0;
printf("i = %d\n", i);
break;
case 2:
i = 4;
printf("i = %d\n", i);
break;
defualt:
i = 5;
printf("i = %d\n", i);
break;
}
return 0;
}
No output!
2011年2月22日 星期二
Short circuit evaluation
計算 gcd 的函式. 注意 && 的 short circuit evaluation.
int gcd(int a, int b)
{
if (b)
while((a %= b) && (b %= a));
return a + b;
}
int gcd(int a, int b)
{
if (b)
while((a %= b) && (b %= a));
return a + b;
}
2011年1月26日 星期三
因果業報
寫 qsort 的人都知道, 在寫比較函式時, 第一件事就是把傳進來的兩個 const void * 指標轉型成為可以操作的型態, 例如 int *. 那麼我們怎麼知道應該要轉成什麼型態?
這時候就要問當初傳進 qsort 的緩衝區是什麼型態了.
比較通俗的說法就是, 種瓜得瓜, 種豆得豆.
佛家的說法就是因果業報. 大般涅槃經有云: 善男子,知善因生善果,惡因生惡果,遠離惡因。如此看來, 指標轉型只是因果業報的表現而已, 只是把之前的因具體還原為現在的果罷了.中間就算經歷無相的境界, 最後還是要回到果報的天理. 所謂佛力不敵業力, 此之謂也.
這時候就要問當初傳進 qsort 的緩衝區是什麼型態了.
比較通俗的說法就是, 種瓜得瓜, 種豆得豆.
佛家的說法就是因果業報. 大般涅槃經有云: 善男子,知善因生善果,惡因生惡果,遠離惡因。如此看來, 指標轉型只是因果業報的表現而已, 只是把之前的因具體還原為現在的果罷了.中間就算經歷無相的境界, 最後還是要回到果報的天理. 所謂佛力不敵業力, 此之謂也.
2011年1月17日 星期一
Never swap with yourself
#include <stdio.h>
#define SWAP(x, y) x ^= y ^= x ^= y
main()
{
int i = 3;
int j = 5;
printf("%d\n", i);
printf("%d\n", j);
SWAP(i, j);
printf("%d\n", i);
printf("%d\n", j);
SWAP(i, i);
printf("%d\n", i);
}
The output.
3
5
5
3
0
2011年1月11日 星期二
A program that prints itself
#include <stdio.h>
#include <assert.h>
int main(void)
{
FILE *fp;
int c;
fp = fopen(__FILE__, "r");
assert(fp != NULL);
while ((c = fgetc(fp)) != EOF)
putchar(c);
fclose(fp);
return 0;
}
Subtraction as a comparator
This is why you should not use subtraction as a comparator.
http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
/* qsort example */
#include <stdio.h>
#include <stdlib.h>
int values[] = {-2147483640, 50, 100};
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
/* qsort example */
#include <stdio.h>
#include <stdlib.h>
int values[] = {-2147483640, 50, 100};
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main ()
{
int n;
qsort (values, 3, sizeof(int), compare);
for (n = 0; n < 3 ; n++)
printf ("%d ",values[n]);
return 0;
}
The output is.
50 100 -2147483640
2011年1月3日 星期一
/ 2 and >> 1
#include <stdio.h>
int main()
{
int i = -13;
if ((i / 2) == (i >> 1))
printf("yes\n");
else
printf("no\n");
return 0;
}
The output is no.
A > 0 and A < -1
int main() { unsigned int ui = 2147483647; if (ui + 1 > 0) printf("ui + 1 > 0\n"); if (ui + 1 < -1) printf("ui + 1 < -1\n"); return 0; }The output.
C:\SVN\book\C>a.exe ui + 1 > 0 ui + 1 < -1
A < 0, B > 0, but B > A is wrong?
A < 0, B > 0, but B > A is wrong?
int main() { int i = 2147483647; unsigned int ui = 2147483647; if (i + 1 < 0) printf("i + 1 < 0\n"); if (ui + 1 > 0) printf("ui + 1 > 0\n"); if (ui + 1 > i + 1) printf("ui + 1 > i + 1\n"); return 0; }The output.
C:\SVN\book\C>a.exe i + 1 < 0 ui + 1 > 0
訂閱:
文章 (Atom)