【C语言初阶】五、操作符详解-创新互联

一、算术操作符

10年积累的做网站、网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有南明免费网站建设让你可以放心的选择与我们合作。

+、-、*、/、%

(1)希望  /  结果是浮点数, 分子或分母必须有一个是浮点数。

(2)%  不能用于浮点数。

二、移位操作符

<<   左移操作符

>>  右移操作符

1.整数的二进制表示3种:

(1)原码

(2)反码

(3)补码

注:

a、正整数的原、反、补码相同;

b、负整数的原、反、补码需要计算。

c、对于有符号(signed)数来说,二进制数的第一位是符号位。0代表正数,1代表负数;

d、整数在内存中以补码的形式存在。

e、但是打印出来的值是以原码的形式打印的;

f、反码求原码两种方法:先取反

g、 右移共有两种,一种是算术右移,一种是逻辑右移;

 算术右移:右边丢弃,左边补原符号位;

 逻辑右移:右边丢弃,左边补0;

 而右移是哪种右移,取决于编译器。

h、移动的位数不能是负数:如,a>>-1是错的。

例:int  a = 5;(32位操作系统)

原码:00000000000000000000000000000101

反码:00000000000000000000000000000101

补码:00000000000000000000000000000101

int b = -5;

原码:10000000000000000000000000000101

反码:111111111111111111111111111111111010(符号位不变,其他位取反)

补码:111111111111111111111111111111111011(反码+1)

2.移位

左移:

a<<1;移动a的补码;

左移前:00000000000000000000000000000101

左移后:00000000000000000000000000001010(左边丢弃,右边补0)

b<<1;移动b的补码

左移前:111111111111111111111111111111111011

左移后:111111111111111111111111111111110110

  反码:111111111111111111111111111111110101

  原码:10000000000000000000000000001010

右移:(算术右移)

a>>1;

右移前:00000000000000000000000000000101

右移后:00000000000000000000000000000010

     

b>>1;

右移前:111111111111111111111111111111111011

右移后:111111111111111111111111111111111101

三、位操作符

&          //按位与

|           //按位或

^            //按位异或

操作数必须是整数。

&: 每个数的二进制补码进行运算,只要有一个数为0则为0,两个数都为1,才是1.

|:  只要有一个数为1,则为1,两个数都是0 才是0;

^: 相同为0,相异为1,0与任何数异或都是那个数本身,两个相同的数异或为0。

例 1:

不能创建临时变量(第三个变量),实现两个数的交换

方法一:(此方法问题,当a+b的和过大,超过int的范围时,则会导致数据的丢失)

#includeint main()
{
    int a=3;
    int b=5;
    printf("a=%d  b=%d",a,b);
    a=a+b;
    b=a-b;
    a=a-b;
    printf("a=%d  b=%d",a,b);
    return 0;
}

方法二、

#includeint main()
{
    int a=3;
    int b=5;
    printf("a=%d  b=%d",a,b);
    a=a^b;//(1)
    b=a^b;//(2)
    a=a^b;//(3)
    printf("a=%d  b=%d",a,b);
    return 0;
}

解释:

由异或的性质,两个相同的数异或结果为0;

那么a=a^b;

第二个式子b=a^b; 可以看做 b=a^b^b,(两个相同的数异或结果为0),得b=2;

第三个式子a=a^b;联立式1和式二;可得a=a^b^a,解得a=b;

例 2:

求一个整数在内存中存储的二进制形式有几个1。

方法一、

#includeint main()
{
    int n=0;
    scanf("%d",&n);
    int i=0;
    int count=0;

    for(i=0;i<32;i++)
    {
        if((n>>i)&1==1)
        {
            count++;
        }
    }
    printf("%d\n",count);

    return 0;
}

四、赋值操作符

=、+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=

五、单目操作符

!           逻辑反操作  ->真变假,假变真->0为假,非0真。 -           负值 +           正值 &           取地址 sizeof       操作数的类型长度(以字节为单位) ~           对一个数的二进制按位取反 --           前置、后置 -- ++           前置、后置 ++ *           间接访问操作符 ( 解引用操作符 ) ( 类型 )       强制类型转换

sizeof:   a、是操作符不是函数;b、如果求变量的大小,可省去(),是类型不可省去;c、sizeof(s=a+3);括号中的表达式不参与运算,出来后s的值不变;

例: ~  的应用

int a=11;
//此时二进制为
//00000000000000000000000000001011
//想要将第三位的0变成1;
//将第三位或一个1即可
//00000000000000000000000000000100
a |= 4;
//而4是1向左移动两位得来的,即
a |= (1<<2);


//此时又想将或之后的数变回去,此时的二进制数是
//00000000000000000000000000001111
//要想将第三位变回0,需要与一个0,即
//11111111111111111111111111111011
//上边的数又是通过4取反得来的,即
//00000000000000000000000000000100取反,代码为:

a |= (~(1<<2));

注:

a、C语言在C99之前无表示真假的类型,C99中引用了布尔类型

六、关系操作符

if("abcdefg"=="ahbhgh")

此时 == 比较的是两个数组首字母的地址。

七、逻辑操作符

&&、||

#includeint 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\nd = %d\n", a, b, c, d);
    return 0;
}

该代码的输出结果是1 2 3 4;

因为a++是先使用后++,但最初a=0,而&&运算符当有一个是0 时,就不继续运算了。

如果改为 || 的话,如果有一个为真,后边的就不继续计算了。

八、下标引用、函数调用和结构成员

下标引用

arr[4]      等价于     *(arr+4)            等价于      4[arr]

九、表达式求值(重要!)

       表达式求值的顺序一部分是由操作符的优先级和结合性决定;        有些表达式的操作数在求值的过程中可能需要转换为其他类型。

1.隐式类型转换

整形提升:表达式中的字符和短整型操作数在使用之前被转换为普通整型。

整形提升的方法:

int main()

{

char c1=3;

  //3是一个整型数字,二进制序列为:

  //00000000000000000000000000000011

  //但存储到char类型的变量中会发生截断,即

  //00000011(在c1中的存储)

  char c2=127;

  //127二进制序列为:

  //000000000000000000000000001111111

//截断

  //01111111

  

  char c3 = c1 + c2;

  //在计算时,需要再次将c1与c2进行整型提升,提升为int类型,即

  //c1:       00000000000000000000000000000011

  //c2:       000000000000000000000000001111111

  //相加得:00000000000000000000000001000010

  //再次存入到char类型的c3中为

  //1000010(此时最高位1 是符号位)

  printf("%d\n",c3);

  //printf()打印是看的是原码;

  //c3进行整形提升,即:(对于有符号数,提升时补符号位)

  //1111111111111111111111111000010

  //转成原码:

  //1000000000000000000001111101

  //结果为:126

}

2.算数转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

3.操作符的属性 

(1)优先级

(2)结合性

(3)是否控制求值顺序

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


新闻标题:【C语言初阶】五、操作符详解-创新互联
文章位置:http://azwzsj.com/article/eddhc.html