运算符的相关问题总结
逻辑运算符
1、|| 逻辑或运算符:表示只有一个为真的时候结果为真,只有一个为假的时候结果为假
2、&& 逻辑与运算符:表示同时为真才为真,同时为假才为假
3、a++,a-- 后置加加减减:表示先赋值再加加减减
4、++a,–a 前置加加减减:表示先加加减减再赋值
相关例题:
第一题:
设x,y,t均为int型变量,则执行语句
x=y=2,t=3;t=x++ || ++y后变量t和
y的值,分别为多少?
求解:t = 1,y=2。因为x++非零为真,根据||运算符的短路现象,++y表达式不用计算。所以t为真等于1,y没有计算还是为2.
第二题:
请问程序输出的是什么?
int main()
{
int a = 1;
int b = 0;
int c = 0;
if(a++ && b++ && c++)
{
printf("ture\n");
}
else
{
printf("false\n");
}
printf("%d%d%d\n",a,b,c);
}
求解:false,a=2,b=1,c=0.
因为后置加加是先赋值再加加,所以1&&0=0为假,后面的c++表达式不参与计算。因此输出a=2,b=1,c=0。
第三题:
请问程序输出的是什么?
int main()
{
int a = 0;
int b = 0;
int c = 0;
if(++a && ++b || ++c)
{
a++;
b++;
c++;
}
printf("%d%d%d\n",a,b,c);
}
求解:a=2,b=2,c=0
第四题:
请问程序输出的是什么?
int main()
{
int arr[] = {1,2,3,4};
int *p = &arr[1];
int i = 1;
printf("%d%d\n",p[i++],p[i++]);
return 0;
}
求解:4,3
因为对指针的操作是一个入栈操作,所以应该从右往左看。因为i = 1,所以入栈顺序应该是p[2],p[3],相应的输出时出栈,打印数字为4,3.
位运算符
1、>> 左移操作
2、<<右移操作
3、^异或操作:不一样为1,一样为0
4、|按位或:存在1结果为1,存在0结果为0.
5、&按位与:都为1才为1,都为0才为0.其余都为0
去掉最后一位 | (101101->10110) | x >> 1
在最后加一个0 | (101101->1011010) | x << 1
在最后加一个1 | (101101->1011011) | (x << 1)|1
把最后一位变成1 | (101100->101101) | x | 1
把最后一位变成0 | (101101->101100) | (x | 1)-1或者
最后一位取反 | (101101->101100) | x ^ 1
把右数第k位变成1 | (101001->101101,k=3) | x | (1 << (k-1))
把右数第k位变成0 | (101101->101001,k=3) | x & ~(1 << (k-1))
右数第k位取反 | (101001->101101,k=3) | x ^ (1 << (k-1))
取末三位 | (1101101->101) | x & 7
取末k位 | (1101101->1101,k=4) | x & ((1 << k)-1)
取右数第k位 | (1101101->1,k=4) | (x >> (k-1)) & 1
把右边连续的1变成0 | (100101111->100100000) | x & (x+1)
把右起第一个0变成1 | (100101111->100111111) | x | (x+1)
把右边连续的0变成1 | (11011000->11011111) | x | (x-1)
来源:CSDN
作者:汪鑫雨
链接:https://blog.csdn.net/qq_43412060/article/details/104166097