运算符

微笑、不失礼 提交于 2020-02-04 14:19:53

运算符的相关问题总结

逻辑运算符

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)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!