Re: [問題] 索引值的型態
看板C_and_CPP (C/C++)作者uranusjr (←這人是超級笨蛋)時間11年前 (2014/10/03 21:46)推噓2(2推 0噓 38→)留言40則, 6人參與討論串2/2 (看更多)
※ 引述《bjiyxo (若自礌)》之銘言:
: 如題
: 因為曾聽過不同型態的變數做運算的時候
: 會增加電腦的負擔
: 而索引值又常常用到
: 所以好奇想問
: 索引值的預設型態是什麼?
→
10/02 18:52,
10/02 18:52
→
10/02 18:52,
10/02 18:52
→
10/02 19:44,
10/02 19:44
→
10/03 15:52,
10/03 15:52
→
10/03 15:53,
10/03 15:53
→
10/03 15:55,
10/03 15:55
我想說一下我選 ptrdiff_t 的原因
首先, 根據標準, subscripting 只是指標運算 + dereferencing 的 syntax sugar
也就是對於一個陣列 a 與整數 i(注意這邊都還完全不考慮形態)
a[i]
完全對等於
*(a + i)
這有兩個意義:
1. Subscript 使用的型別應該與 pointer 型別相同
其實我猜 compiler 都會最佳化, 不過如果完全照字面解答原 po 的問題, 那麼
我們要找的應該是 pointer 運算時使用的型別。
2. Subscript 值可以是負的
由於負方向的指標運算完全合法, negative subscript(e.g. a[-1])完全符合
標準, 即使並不直觀。
所以 size_t 並不符合。主要因為它是無號整數, 不過其實也沒人說過它和指標有什
麼關聯。我們要找的是用在指標運算, 且有號的型別:
http://goo.gl/1Xpf6x (www.gnu.org)
Data Type: ptrdiff_t
This is the signed integer type of the result of subtracting two pointers.
For example, with the declaration char *p1, *p2;, the expression p2 - p1
is of type ptrdiff_t. This will probably be one of the standard signed
integer types (short int, int or long int), but might be a nonstandard
type that exists only for this purpose.
延續前面的例子, 假設 a 是 foo 的 array, 且索引取值後的結果是 b:
b = a [ i ]
↑ ↑ ↑
foo foo[] ??
b = *( a + i )
↑ ↑ ↑
foo foo[] ??
令 *c = b, 則
c = a + i
↑ ↑ ↑
foo* foo[] ??
i = c - a 讓 a decay 為指標
↑ ↑ ↑
?? foo* foo*
根據上面的規範, i 的型別顯然應該是 ptrdiff_t。
--
「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。
如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」
-- 班尼多‧加羅素,前義大利藍隊成員
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1412343985.A.BD3.html
推
10/03 22:10, , 1F
10/03 22:10, 1F
→
10/03 22:10, , 2F
10/03 22:10, 2F
→
10/04 00:08, , 3F
10/04 00:08, 3F
→
10/04 00:08, , 4F
10/04 00:08, 4F
推
10/04 04:22, , 5F
10/04 04:22, 5F
→
10/04 04:23, , 6F
10/04 04:23, 6F
→
10/04 04:23, , 7F
10/04 04:23, 7F
→
10/04 04:23, , 8F
10/04 04:23, 8F
→
10/04 04:24, , 9F
10/04 04:24, 9F
→
10/04 04:25, , 10F
10/04 04:25, 10F
→
10/04 04:25, , 11F
10/04 04:25, 11F
→
10/04 04:26, , 12F
10/04 04:26, 12F
→
10/04 04:27, , 13F
10/04 04:27, 13F
→
10/04 04:27, , 14F
10/04 04:27, 14F
→
10/04 04:28, , 15F
10/04 04:28, 15F
→
10/05 01:58, , 16F
10/05 01:58, 16F
→
10/05 03:15, , 17F
10/05 03:15, 17F
→
10/05 03:16, , 18F
10/05 03:16, 18F
→
10/05 03:16, , 19F
10/05 03:16, 19F
→
10/05 13:56, , 20F
10/05 13:56, 20F
→
10/05 13:56, , 21F
10/05 13:56, 21F
→
10/05 13:56, , 22F
10/05 13:56, 22F
→
10/05 13:57, , 23F
10/05 13:57, 23F
→
10/05 13:58, , 24F
10/05 13:58, 24F
→
10/05 13:59, , 25F
10/05 13:59, 25F
→
10/05 22:51, , 26F
10/05 22:51, 26F
→
10/05 22:53, , 27F
10/05 22:53, 27F
→
10/05 22:55, , 28F
10/05 22:55, 28F
→
10/05 22:56, , 29F
10/05 22:56, 29F
→
10/05 23:05, , 30F
10/05 23:05, 30F
→
10/05 23:13, , 31F
10/05 23:13, 31F
→
10/05 23:17, , 32F
10/05 23:17, 32F
→
10/05 23:22, , 33F
10/05 23:22, 33F
→
10/05 23:23, , 34F
10/05 23:23, 34F
→
10/05 23:24, , 35F
10/05 23:24, 35F
→
10/05 23:27, , 36F
10/05 23:27, 36F
→
10/05 23:29, , 37F
10/05 23:29, 37F
→
10/05 23:30, , 38F
10/05 23:30, 38F
→
10/05 23:32, , 39F
10/05 23:32, 39F
→
10/05 23:34, , 40F
10/05 23:34, 40F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章