2017-06-15 40 views
-5

我有以下代碼:功能無法寫入整數

int vals = 0b000000000000000000; 
void setBit(int num, int x, int n) { 
    num ^= (-x^num) & (1 << n); 
} 
int main() { 
    setBit(vals, 0, 1); 
    printf("%i\n", vals); 
} 

但是,在setBit()功能不寫入valsprintf()打印0,但它應打印1(vals0b000000000000000001)。爲什麼?

+8

你永遠不會改變的值。給函數賦予vals的副本,然後改變它。 – Carcigenicate

+0

'0b000 ...'是無效的語法 – pmg

+1

,因爲您按值傳遞值。 C中的每一件事都是按價值傳遞的。 – EsmaeelE

回答

3

由於您沒有傳遞指針,因此當您傳遞它時,您複製了vals。而不是試圖修改參數,只是返回修改後的值:

int vals = 0b000000000000000000; 

int setBit(int num, int x, int n) { 
    num ^= (-x^num) & (1 << n); 
    return num; 
} 

int main() { 
    vals = setBit(vals, 0, 1); 
    printf("%i\n", vals); 
} 

儘量不要不必要地修改參數。這可能會傷害可讀性。希望儘可能返回。

0

在C中,參數按值傳遞。所以儘管函數內部發生了什麼,它們的值在調用之後不會改變。

只需返回更改的值。

或者使用指針:

int vals = 0b000000000000000000; 
void setBit(int* num, int x, int n) { 
    *num ^= (-x^*num) & (1 << n); 
} 
int main() { 
    setBit(&vals, 0, 1); 
    printf("%i\n", vals); 
} 
+2

- 可疑和不必要的陳述。 Java,Python等不同。 – Olaf

+0

@Olaf我同意「可疑」部分,在例子中不同意。 Java也使用按值傳遞。 (當java對象被傳遞時,對該對象的引用實際上是按值傳遞的)。 [Post btw] – KyrSt

+0

參考文獻與價值傳遞相反,他們不是一流的類型(他們沒有自己的價值)。不確定簡單類型/標量,但IIRC對象通過Java中的引用傳遞。 – Olaf

1

setBit正式參數num處於main存儲器比實際參數vals一個不同的對象; num的任何更新都不會反映在vals中。

你有兩個選擇,要麼不喜歡Carcigenicate建議,並返回新值:

int setBit(int num, int x, int n) 
{ 
    num ^= (-x^num) & (1 << n); 
    return num; 
} 
... 
vals = setBit(vals, 0, 1); 

或者,使用指針:

void setBit(int *num, int x, int y) 
{ 
    *num ^= (-x^*num) & (1 << n); 
} 
... 
setBit(&vals, 0, 1);