7

~i在 C++ 中如何工作?

我刚刚注意到它相当于i != -1,但我不确定。

int arr[3] {1, 2, 3};
int n = 3;
for (int i = n - 1; ~i; i--) {
    cout << arr[i] << ' ';
}

它反向打印数组。

4

3 回答 3

14

~是按位 NOT 运算符。~i当且仅当i所有位都为 1 时为 0。-1 是否所有位都为 1 取决于有符号数在系统上的表示方式。在二进制补码表示中,-1 用所有位 1 表示,在这样的系统上也是如此~(-1) == 0。无论是在一个补码中,还是在符号和大小中,这都不成立。

因此,答案是否定的;并非在所有系统上。也就是说,二进制补码在现代机器(自 90 年代以来制造的所有产品)中相当普遍,在此类系统上,答案是肯定的。然而,无论符号表示如何,i != -1都更具可读性。

于 2019-06-26T12:28:45.230 回答
5

~i是按位 NOT 运算符。即它反转每一位i。-1 表示二进制,因为数字的每一位都设置为 1,将每一位反转为 0 会得到 0。当在预期的地方检查整数时,bool0 被视为false,任何其他数字都被视为true

因此,在这种特殊情况下,yes,~i等同于i != -1.

于 2019-06-26T12:23:59.953 回答
0

因为 for 循环中的 i 变量是 int 类型,它被定义为有符号整数,因此在二进制补码中,它的值 -1 的二进制表示是所有位设置,这意味着所有位都是 1。另一方面,按位所有的否定都是零,这就是你需要的,循环执行直到 i>=0 或 i!=-1,因为你递减 i。在系统上符号值的按位运算的上下文中,int 的二进制补码表示,是的,它是相同的。

于 2019-06-26T12:55:15.477 回答