2012-07-25 78 views
0

可能有人解釋下面的代碼給我聽聽,特別是因爲它似乎導致我的代碼出錯的第三行:請解釋sbegin = s? s:*持續;

char * (strtok_r)(char *s, const char *delimiters, char **lasts) { 
    char *sbegin, *send; 
    sbegin = s ? s : *lasts; 
    ... 

即時猜測它更像林傳遞不正確的指針值或東西,但不能搞清楚作爲林不知道的功能究竟是如何做它...

編輯:我不是很確定時發生的錯誤或者是因爲G $£&萬F *£ $%^%Visual Studio JIT調試器不斷嘗試打開所有的時間並把所有的東西都弄亂了。 GRR ..

+0

這是一篇[文章](http://en.wikipedia.org/wiki/%3F :)就可以了。 – chris 2012-07-25 16:11:09

+1

hmmm,可以是其 'if(s!= NULL){ \t \t sbegin = s; \t} else { \t \t sbegin = * lasts; \t}' – Toby 2012-07-25 16:11:58

回答

5

相當於

if (s) 
    sbegin = s; 
else 
    sbegin = *lasts; 

要獲得更詳細的有關?:運營商,你可以閱讀this

+0

好東西,謝謝 – Toby 2012-07-25 16:14:47

3

線:

sbegin = s ? s : *lasts; 

相同:

if(s) 
    sbegin = s; 
else 
    sbegin = *lasts; 

?:被稱爲三元運算符。

2

這部分代碼被稱爲ternary operation

sbegin = s ? s : *lasts; 

等同的

if(s != null) sbegin = s 
else sbegin = *lasts; 
1

它看起來好像沒什麼問題,唯獨身邊strtok_r括號是有點多餘和不尋常的。

第三行使用三元操作符操作符:它是一個表示條件的正確表達式。如果問號?之前的部分評估爲真(即,除0之外的其他部分),則整個表達式將具有在?:之間的表達式的值。否則它會在冒號:後面的表達式。

由於sbegins*lasts的類型匹配,我沒有看到那裏的問題。

+0

在這個表達式's'爲空之後sbegin仍然以NULL結尾......所以我猜想我的'lasts'沒有在調用之間保持正確的值...... Aha !對於調用函數而言,'lasts'是局部的,所以它在* its * parent對該函數的調用之間被擦除。乾杯! – Toby 2012-07-25 16:23:04

+0

Jeez很高興能夠在這裏反彈的想法,Id一直撕下我的頭髮,這個錯誤來自哪裏後,代碼似乎工作罰款一分鐘然後死於下一個..如果我能不止一次地投票,我會! – Toby 2012-07-25 16:41:35

+1

@Toby:不客氣:) – bitmask 2012-07-25 17:13:14