我正在嘗試制作一個程式,用按位運算子交換函式中的 2 個變數,但該函式不會執行任何操作。我很確定我得到了正確的 XOR 交換的基本邏輯(我通過手動執行一些操作進行了檢查,并在 main 中進行了檢查),但是由于某種原因,功能塊不會做任何事情。此外,我對 C 編程非常陌生,所以請原諒我沒有發現一些明顯的愚蠢錯誤。
代碼是:
#include <stdio.h>
void swap(int *a, int *b)
{
printf("value of a=%d b=%d before swapping\n", *a, *b);
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
printf("value of a=%d b=%d after swapping\n", *a, *b);
}
int main()
{
int a, b, *p, *q;
printf("Enter 2 numbers to be swapped: \n");
scanf("%d %d", &a, &b);
p = &a;
q = &b;
void swap(p, q);
printf("\nfinal %d %d", a, b);
}
uj5u.com熱心網友回復:
gcc 甚至沒有-Wall指出錯誤的確切位置。只需編譯代碼并查看它指向的位置:
warning: parameter names (without types) in function declaration
| void swap(p, q);
| ^~~~
^ 箭頭表示“這里有錯誤”。只需將void放入函式呼叫中即可。
此外,XOR 交換是那些“只為了它而混淆”的事情之一。它的唯一目的似乎是冒充,因為臨時變數交換通常會產生更高效的代碼。在 x86 gcc -O3 上查看此基準測驗:
void xor_swap(int *a, int *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
void tmp_swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
xor_swap:
mov eax, DWORD PTR [rdi]
xor eax, DWORD PTR [rsi]
mov DWORD PTR [rdi], eax
xor eax, DWORD PTR [rsi]
mov DWORD PTR [rsi], eax
xor DWORD PTR [rdi], eax
ret
tmp_swap:
mov eax, DWORD PTR [rdi]
mov edx, DWORD PTR [rsi]
mov DWORD PTR [rdi], edx
mov DWORD PTR [rsi], eax
ret
的tmp_swap既更可讀的和更有效的。
編輯:實際上我剛剛用這個多玩了一輪,XOR 版本的低效率主要來自于指標可能別名的假設。更新函式以void xor_swap(int* restrict a, int* restrict b)使其與tmp_swap(但仍然不太可讀)一樣快。
uj5u.com熱心網友回復:
編譯器應該為此行發出錯誤或至少警告訊息
void swap(p, q);
因為它是不正確的。
它是帶有識別符號串列的函式宣告,但在與其定義不同的函式宣告中,識別符號串列應為空。
相反,您需要呼叫函式 swap
swap( p, q );
實際上指標p和q都是多余的。你也可以像這樣呼叫函式
swap( &a, &b );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/378674.html
上一篇:為什么這些運算式不適用于此代碼?
