unsigned int a = 0; if(a < a-1) { printf("/nunsiged"); }else{ printf("/nsigned"); }分析:如果a為有符號數:那麼0<-1不成立,則會打印signed;
通過概率的計算,你會發現每個字符被選中的概率是一樣的,並且是隨機的,因為有可能選中的是第一個字符,也可能是最後一個,或者是其中任意一個。這和抽簽的原理是一樣的,想想是不是這樣!
問題四:文件描述符與文件指針的區別
在linux系統中把設備和普通文件都看做是文件,要對文件操作就必須先打開文件,打開文件後會得到一個文件描述符,它是一個很小的正整數,是一個索引值,是一個小整數,其值在(0-255)之間。每個進程PCB(Process Control Block)中保存著一份文件描述符表,文件描述符就是這個表的索引,每個表項都有一個指向已打開文件的指針。所以文件描述符就是開放文件每個進程表的一個偏移量(如"3"),用於文件標示。
缺點:系統I/0調用有create(),open(),read(),write(),close()等。它們不是ANSI C的一部分,所以移植性差,不能存在於非UNIX環境。但是現在的ANSI C規定所有的編譯器環境都必須支持它們。
文件指針:C語言中使用文件指針做I/O的句柄。文件指針指向進程用戶區中的一個被稱為FILE結構的數據結構。FILE結構包括一個緩沖區和一個文件描述符。而文件描述符是文件描述符表的一個索引,因此某種意義上說文件指針就是句柄的句柄,在windows系統中文件描述符被稱作文件句柄。所以FILE指針保存了一個FILE結構的地址。
FILE結構中含有文件描述符,那麼可以使用fopen來獲得文件指針,然後從文件指針獲取文件描述符,文件描述符應該是唯一的,
而文件指針卻不是唯一的,但是指向的對象是唯一的。
FILE的結構
struct _iobuf { char *_ptr; //緩沖區當前指針 int _cnt; char *_base; //緩沖區基址 int _flag; //文件讀寫模式 int _file; //文件描述符 int _charbuf; //緩沖區剩余自己個數 int _bufsiz; //緩沖區大小 char *_tmpfname; };C語言文件指針與文件描述符之間可以相互轉換:
int fileno( FILE *stream );//fileno()用來取得參數stream指定的文件流所使用的文件描述符。 FILE *fdopen(int fd,const char *mode);//創建一個新的FILE結構,並把它與一個確定的文件描述符相關聯。