1.sizeof
int main()
{
short s = 0;
int a = 10;
printf("%d\n", sizeof(s = a + 5));//关键看s的类型,sizeof后的表达式不会真实运算
printf("%d\n", s);
return 0;
}
2.按位异或实现交换两个数
int main()
{
int a = 20;
int b = 10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d,b=%d", a, b);
return 0;
}
3.求一个整数存储在内存中的二进制中1的个数
按位与&:同1为1 其余为0
按位或 |:同0为0 其余为1
按位异或:相同为0 相异为1
int main()
{
int num = 0;
scanf("%d", &num);
int count = 0;
//不支持负数的版本
/*while (num)
{
if (1 == num % 2)
{
count++;
}
num = num / 2;
}*/
int i = 0;
for (i = 0; i < 32; i++)
{
if (1==((num >> i)&1))
{
count++;
}
}
printf("%d\n", count);
return 0;
}
4.c只要参与表达式运算,就会发生整形提升,表达式+c,会发生提升,所以sizeof(+c)、sizeof(-c)是四个字节,但是sizeof(c)是一个字节。
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(!c));
return 0;
}
5.一道360笔试题
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i=a++ || ++b || d++;
printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d);
return 0;
}
逻辑与 前为真才执行后面
逻辑或 前为假才执行后面
a=0时执行结果:1 2 3 4
a=1时执行结果:2 3 3 5