~i
在C ++中如何工作?
我刚刚注意到它等同于i != -1
,但我不确定。
int arr[3] {1, 2, 3};
int n = 3;
for (int i = n - 1; ~i; i--) {
cout << arr[i] << ' ';
}
它反向打印了阵列。
答案 0 :(得分:14)
~
是按位NOT运算符。当且仅当~i
的所有位都为1时,i
才为0。 -1是否具有所有位1取决于系统上符号号的表示方式。在二进制补码表示中,-1用所有位1表示,因此在这样的系统~(-1) == 0
上。不论是在补语上,还是在符号和幅度上,都不成立。
因此,答案是否定的。并非在所有系统上。就是说,在现代机器(自90年代以来的所有产品)中,二进制补码是相当普遍的,在这样的系统上,答案是肯定的。但是,不管符号表示如何,i != -1
都更具可读性。
答案 1 :(得分:5)
~i
是按位NOT运算符。即它会反转i
中的每一位。
-1表示二进制,因为数字的每一位都设置为1,将每一位都反转为0会得到0。并且在检查bool
期望为0的整数时,将被视为false
和其他任何值数字为true
。
因此,在这种特殊情况下,~i
与i != -1
等效。
答案 2 :(得分:0)
因为for循环中的i变量为int类型,定义为有符号整数,因此在二进制补码中,其值-1的二进制表示形式为所有位,这意味着所有位均为1。边,全1的按位求反全为零,这就是您所需要的,直到i> = 0或i!=-1为止循环执行,因为您递减了i。在系统上对符号值进行按位运算的情况下,int具有二进制补码二进制表示形式,是的,它是相同的。