2010-01-22 71 views

回答

6

無 - 有評價爲參數的函數調用沒有定義的順序。

即使調用object_get_array()具備呼叫到object_set_array()之前發生,可以在編譯器使得呼叫object_get_array()之前完成了編譯器計算並傳遞到object_set_array()len參數的值。

我不知道到object_set_array()調用第二個參數的目的是 - 也許你想用逗號:

void object_foo (Object* self, Object* obj) { 
    int len; 

    object_set_array (self, (object_get_array (obj, &len), len)); 
} 

這會工作,但很混亂,東西我不會」建議。

我想你想要的是:

void object_foo (Object* self, Object* obj) { 
    int len; 

    object_get_array (obj, &len); // get the length from obj 

    object_set_array (self, len)); // set the len for self 
} 
+2

第二個也更可讀。 – GManNickG 2010-01-22 23:50:40

0

在初始化之前,您將len按值傳遞給object_set_array()調用。所以這是錯誤的,一個好的編譯器會對此提出警告。該變量將包含一個隨機值,所以代碼不會崩潰,但它不會做你可能想要的。

1

否。在評估第二個參數(object_get_array())之前,可以評估第object_set_array()的第三個參數並將其推入堆棧。

也許你想

void object_copy (Object* self, Object* obj) { 
    int len; 
    /* I'm just guessing as to the return type */ 
    Object *pObj = object_get_array(obj, &len); 
    object_set_array (self, pObj, len); 
} 
+0

@sth:是的,我知道我正在避開呼叫公約問題,謝謝。 – egrunin 2010-01-23 03:18:05

0

如果object_get_array失敗,那麼len可能不會被初始化。在致電object_set_array之前,最好先打電話object_get_array,這樣你就可以測試通話是否有效。

下面是一個示例代碼,請注意,我不知道是什麼object_get_array回報,所以我使用了一個void *,使其更容易解釋:

 
void *obj; 
obj = object_get_array(obj, &len); 
if (obj != NULL) object_set_array(self, obj, len); 

,你所編寫的代碼是危險的,但訴諸像這樣的快捷方式可能會導致您認爲object_set_array失敗,而不是object_get_array。你必須自己判斷它是否會失敗,我總是認爲代碼失敗,所以我可以採取安全措施,你的方法會有所不同,某些捷徑可以,但這不是!

雖然,C代碼是從左至右執行中的表達是如何評價(依賴於編譯器和編譯代碼),如果函數的工作,那麼,len將被初始化的順序,但它不安全。

希望這會有所幫助, 最好的問候, 湯姆。

0

這也將工作:

ARRAY object_get_array (Object* self, int* len); 
void object_set_array (Object* self, ARRAY array, const int* len); 

// ... 

void object_copy (Object* self, Object* obj) { 
    int len; 
    object_set_array (self, object_get_array (obj, &len), &len); 
} 

因爲調用object_get_array()總是會調用object_set_array(),此時len將被設置爲正確的值之前進行評估。

+0

這是我的問題的對象,它看起來像其他答案是明確的評價順序未定義在C中的參數。你能提供更多的信息來確認你的答案嗎? – elmarco 2010-01-23 01:29:41

+0

問題是'len'在被賦值之後通過引用傳遞,而不是被賦值(可能在賦值之前)。 – finnw 2010-01-23 03:09:51