設萬維讀者為首頁 萬維讀者網 -- 全球華人的精神家園 廣告服務 聯繫我們 關於萬維
 
首  頁 新  聞 視  頻 博  客 論  壇 分類廣告 購  物
搜索>> 發表日誌 控制面板 個人相冊 給我留言
幫助 退出
     
  YDX的博客
  YDX的博客
網絡日誌正文
兩堂C/C++基礎課()和 [] 2011-04-09 23:28:55
基礎課一:函數調用算符()

我在前文中提到下面這行難住10歲開始編程的牛博士的代碼

local = (char *(*)()) inc_1;

很多人號稱學過C,但是看了這行代碼看不懂之後,說這是垃圾。其實這是一句必要的code,程序員在寫的時候並沒有在故弄玄虛,而是寫了最簡短的代碼。這是一個很早以前的程序中的一行代碼,並非編造。而且是一行簡單的代碼--如果你能懂C。

按理說,一個人學過C/C++, 要有點創造力,可以幾乎零成本創業,一台PC,加上大腦就應該可以開發產品了---Linus一個人完成了Linux主要核心部分,Thompson和Ritchie一萬多行C搞定UNIX 。

問題在於,很多人學了C,並不懂C語言,他們只會文科C:就是模仿一些pattern,依樣畫葫蘆,真要變通一下,就搞不清了。要成為高等電民,得學會理工思維,搞清原理,否則跟勞工差不多,只會copy&paste。

看上面這段代碼右邊,最外面是一層括弧後跟一個inc_1,所以這是一個cast 語句,也就是括號裡面必須是一個type。什麼type呢?一看裡面的()的算符就知道了,()叫函數調用算符(當然這裡的作用不是調用函數,而是聲明類型), call operator。所以裡面是一個pointer to function,而這個function的return type是 char*。

當然,程序員如果稍微勤快點,他可能會這麼寫

typedef char* (*ptr_func)();

local = (ptr_func) inc_1;


基礎課二:下標算符 [ ]

C++基本是C的一個superset,因此C里的表達在C++絕大部分是合法的。

E1 [E2] 類型的expression 為postfix-expression的一種。

其中E1為postfix-expression, E2為expression. 

E1[E2]的語義是 *(E1+E2).

所以我們只要求 E1+E2 產生一個指針。根據+運算的屬性,只要E1或者E2中的任一個是指針即可。換言之,E1[E2]與E2[E1]可能是完全等價的(排除[]被重載的情況)。

瀏覽(753) (0) 評論(1)
發表評論
文章評論
作者:姚夭夭 留言時間:2011-04-10 12:01:22
按岳東曉自己的標準,他也是被10[a]問倒了。回去查書也查了一天(24小時),那個磚家記不得
(char*(*const)(int))PRT,
要回家查書也沒什麼奇怪的。書上都沒講這些。我還是在十好幾年前第一份工作時試驗了幾天才學會的(那時我想用C語言搞個中斷向量表)。書上不講的,那時網上的資料沒有現在的這麼多。
回復 | 0
我的名片
-YDX-
註冊日期: 2010-08-29
訪問總量: 791,824 次
點擊查看我的個人資料
Calendar
最新發布
· 給肯特州立大屠殺受難者平反不符
· 除暴安良的正義感超越國家與制度
· 以人民民主制衡封建官僚主義是反
· 為什麼中國能拿乒乓球冠軍卻拿不
· 從楊開慧的死看歷史為什麼選擇了
· 大眾社會的操控模式與互聯網時代
· 肯特州立事件的平反問題
分類目錄
【日誌】
· 給肯特州立大屠殺受難者平反不符
· 除暴安良的正義感超越國家與制度
· 以人民民主制衡封建官僚主義是反
· 為什麼中國能拿乒乓球冠軍卻拿不
· 從楊開慧的死看歷史為什麼選擇了
· 大眾社會的操控模式與互聯網時代
· 肯特州立事件的平反問題
· 什麼是哥特建築--歷史知識
· 嘗試翻譯溫家寶總理的幾句話
· 華裔女生偷窺、白人男生自殺事件
存檔目錄
2012-06-03 - 2012-06-03
2012-05-11 - 2012-05-11
2012-04-03 - 2012-04-15
2012-03-02 - 2012-03-29
2012-02-01 - 2012-02-28
2012-01-13 - 2012-01-31
2011-12-04 - 2011-12-28
2011-11-03 - 2011-11-24
2011-10-03 - 2011-10-29
2011-09-01 - 2011-09-25
2011-08-16 - 2011-08-31
2011-07-01 - 2011-07-27
2011-06-04 - 2011-06-29
2011-05-04 - 2011-05-31
2011-04-02 - 2011-04-28
2011-03-05 - 2011-03-28
2011-02-01 - 2011-02-28
2011-01-03 - 2011-01-27
2010-12-01 - 2010-12-31
2010-11-03 - 2010-11-30
2010-10-03 - 2010-10-30
2010-09-29 - 2010-09-30
2010-08-28 - 2010-08-29
 
關於本站 | 廣告服務 | 聯繫我們 | 招聘信息 | 網站導航 | 隱私保護
Copyright (C) 1998-2026. Creaders.NET. All Rights Reserved.