2011年8月6日 星期六

4 * 5 = 20

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

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%。其他因素包括外務太多,會被二一,時間管理不當等等。我會這樣說並不是想耍酷,而是因為我想盡量把成績計算單純化,公平化。否則要考慮的因素太多,不單純,也不公平。成績計算就是反映你的學習成效,最單純公平的辦法就是看作業和考試。這是我的信念 ,也是我對這個問題的答案。

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;
}

2011年1月26日 星期三

因果業報

寫 qsort 的人都知道, 在寫比較函式時, 第一件事就是把傳進來的兩個 const void * 指標轉型成為可以操作的型態, 例如 int *. 那麼我們怎麼知道應該要轉成什麼型態?
這時候就要問當初傳進 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 );
}

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