1.题1
- int main()
- {
- int count = 0;
- int x = -1;
- while (x)
- {
- count++;
- x = x >> 1;
- }
- printf("%d", count);
- return 0;
- }
上述代码的运行结果是什么呢?
我们来分析一下:我们知道在vs中右移操作符的规则是,右边抛弃,左边由符号位相同的字符补齐。不太熟练地可以看一下之前的作品 。这里的while循环条件是x,如果x=x>>1,不能使x变为0,那么该程序就会陷入死循环。我们发现x总是等于-1,这是因为补齐的是1,舍弃的也是1,这样的话,补码始终不变,所以该程序会陷入死循环。
2.题2
- int func(int x)
- {
- int count = 0;
- while (x)
- {
- count++;
- x = x & (x - 1);//与运算:只要有0就是0,同时为1才为1
- }
- return count;
- }
如果传给func函数-1,则运行结果会是什么呢?
我们来分析一下:while循环条件为x当x不为0时就会陷入死循环,其实这道题的难点就是判断x=x&(x-1),这个表达式能在循环的作品用下使x为0。&是与运算操作符,它的运算规则是只要为0就是0,同时为1才为1。不够了解可以看之前的作品。在这里我们发现第一次循环时-1&-2,补码最右端少了一个1,我们继续观察两次发现,每循环一次x的补码最右端就会少一个1,这样的话在64位机器中,int类型的大小是32位bit,所以这里应该会循环32次,故count也会变为32.
我们运行看看:

3.题3
- int main()
- {
- int w = 1, x = 2, y = 3, z = 4;
- int ret=(w < x ? w : y < z ? y : z);
- printf("%d", ret);
- return 0;
- }
上述代码的运行结果是什么呢?
我们来分析一下:这里考查的是条件操作符的使用,大家可能会觉得好长一条代码呀,看上去就好复杂,其实不然,我们首先来看w 我们运行看看: 上述代码的运行结果是什么呢?
4.题4