C语言运算符

目录

算术运算符

逻辑运算符

位运算符

杂项运算符 ↦ sizeof & 三元

取整取余(取模)

取整

取余(取模)

a++ 与 ++a 区别在于一个后加,一个先加。

运算符优先级:

"~"运算符

C 作用域规则

C语言语句

switch 语句嵌套

循环控制语句

continue 语句


算术运算符

下表显示了 C 语言支持的所有算术运算符。

假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ 自增运算符,整数值增加 1 A++ 将得到 11
-- 自减运算符,整数值减少 1 A-- 将得到 9

逻辑运算符

下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:

运算符 描述 实例
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 (A && B) 为假。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 (A || B) 为真。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 !(A && B) 为真。

位运算符

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

p q p & q ( 与) p | q ( 或) p ^ q ( 异或)
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

实例

#include 
 
int main()
{
 
   unsigned int a = 60;    /* 60 = 0011 1100 */  
   unsigned int b = 13;    /* 13 = 0000 1101 */
   int c = 0;           
 
   c = a & b;       /* 12 = 0000 1100 */ 
   printf("Line 1 - c 的值是 %d\n", c );
 
   c = a | b;       /* 61 = 0011 1101 */
   printf("Line 2 - c 的值是 %d\n", c );
 
   c = a ^ b;       /* 49 = 0011 0001 */
   printf("Line 3 - c 的值是 %d\n", c );
 
   c = ~a;          /*-61 = 1100 0011 */
   printf("Line 4 - c 的值是 %d\n", c );
 
   c = a << 2;     /* 240 = 1111 0000 */
   printf("Line 5 - c 的值是 %d\n", c );
 
   c = a >> 2;     /* 15 = 0000 1111 */
   printf("Line 6 - c 的值是 %d\n", c );
}

结果

Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2

杂项运算符 ↦ sizeof & 三元

下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof? :

运算符 描述 实例
sizeof() 返回变量的大小。 sizeof(a) 将返回 4,其中 a 是整数。
& 返回变量的地址。 &a; 将给出变量的实际地址。
* 指向一个变量。 *a; 将指向一个变量。
? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y

取整取余(取模)

取整

语法:a / b (a 取整 b)

作用: 使用整数除法运算把小数部分除去。

例: 1 / 4 = 0; 2 / 4 = 0; 3 / 4 = 0; 4 / 4 = 1; 5 / 3 = 1; 4 / 2 = 2; 

符号与被除数相同:

  • 如果 都是正数或都是负数,结果为正。
  • 如果 为负数,为正数,结果为负。
  • 如果 为正数,为负数,结果为负。

取余(取模)

语法:a % b(a 取余 b)

作用:获取余数

例:1 % 4 = 1; 2 %4 = 2; 3 % 4 = 3; 4 % 4 = 0; 6 % 5 = 1;7 % 5 = 2;

对取余运算的说明 C 语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错。

另外,余数可以是正数也可以是负数由 % 左边的整数决定

  • 如果 % 左边是正数,那么余数也是正数;

  • 如果 % 左边是负数,那么余数也是负数;

例子:

#include 

int main()
{
    printf( "100%%12=%d   \n
             100%%-12=%d  \n
             -100%%12=%d  \n
             -100%%-12=%d \n", 
             100%12, 100%-12, -100%12, -100%-12 );
    return 0;
}

运行结果:

100%12=4
100%-12=4
-100%12=-4
-100%-12=-4 

 不同长度的数据进行位运算

如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。

以“与”运算为例说明如下:在 C 语言中 long 型占 4 个字节,int 型占 2 个字节,如果一个 long 型数据与一个 int 型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足:

  • (1)如果整型数据为正数,左边补 16 个 0。

  • (2)如果整型数据为负数,左边补 16 个 1。

  • (3)如果整形数据为无符号数,左边也补 16 个 0。

如:long a=123;int b=1; 计算 a & b

如:long a=123;int b=-1; 计算 a & b

如:long a=123; unsigned int b=1; 计算 a & b

a++ 与 ++a 区别在于一个后加,一个先加

a++ 输出 a 的值再自加,缓存 a 自加后的结果,用于下次进行与 a 相关的计算。

++a 则相当于 a+1。

#include 

int main(int argc, char **argv)
{
    int a=100;
    int b=50;
    //    b++;
    printf("%d,%d\n",a++,++a);
    printf("%d,%d",b++,++b);
    return 0;
}

运行后输出:

101,102
51,52

若不注释 b++

int main(int argc, char **argv) 
{
    int a=100;
    int b=50;
    b++;
    printf("%d,%d\n",a++,++a);
    printf("%d,%d",b++,++b);
    return 0;
}

则结果为:

101,102
52,53

运算符优先级:

单 算 关 逻 条 赋 逗

括号成员是老大;     // 括号运算符 []() 成员运算符.  ->

全体单目排老二;     // 所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&

乘除余三,加减四;    // 这个"余"是指取余运算即%

移位五,关系六;     // 移位运算符:<< >> ,关系:> < >= <= 等

等与不等排行七;     // 即 == 和 !=

位与异或和位或;     // 这几个都是位运算: 位与(&)异或(^)位或(|)    

"三分天下"八九十;  

逻辑与,逻辑或;    // 逻辑运算符: || 和 &&

十一十二紧挨着;    // 注意顺序: 优先级(||)  底于 优先级(&&) 

条件只比赋值高,    // 三目运算符优先级排到 13 位只比赋值运算符和 "," 高

逗号运算最低级!    // 逗号运算符优先级最低 

"~"运算符

二进制求补运算符(二进制反码运算符、按位反码):对在内存中存储的是补码按位取反(包括符号位)。此时,得到的结果仍为补码,需要进一步转换为原码,得到最终输出信息。

正数的原码、反码、补码是一样的。
对于负数3种码不同:
原码:第一位表示符号位,其余位表示数值。

反码:符号位不变,其余按位取反。

补码:反码加1称为补码。补码=反码+1,反码=补码-1。

在计算机中,负数以其正值的补码形式表达

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。 比如 00000000 00000000 00000000 000001015 的原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。 比如:将 00000000 00000000 00000000 00000101 每一位取反,得 11111111 11111111 11111111 11111010

补码:反码加1称为补码。 也就是说,要得到一个数的补码,先得到反码,然后将反码加上 1,所得数称为补码。 比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010

那么5的补码为: 补码加一 11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011

C 作用域规则

任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:

  1. 在函数或块内部的局部变量

  2. 在所有函数外部的全局变量

  3. 形式参数的函数参数定义中

全局变量与局部变量在内存中的区别

  • 全局变量保存在内存的全局存储区中,占用静态的存储单元;

  • 局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。

C语言语句

switch 语句嵌套

#include
int main(void)
{
    char sex;
    int age  ;
    printf("请输入你的性别简称!男(M),女(F)\n");
    scanf_s("%c", &sex);
    switch (sex)
    {
    case 'M':
    case 'm':
    printf("你的性别为“男”请你进入测试!\n");
    printf("请输入你的工龄!\n");
    scanf_s("%2d",&age);
        switch (age)
        { 
        case 5:
            printf("奖励iphone一台!!\n");
            break;
        case 10:
            printf("奖励汽车一辆!!\n");
            break;
        case 15:
            printf("奖励小楼一栋!!\n");
            break;
        default:
            printf("抱歉,未满足奖励条件或者超出工龄!!\n");
            break;
        }
    break;
    case 'F':
    case 'f':
        printf("你的性别为“女”请你进入测试!\n");
        printf("请出入你的工龄!\n");
        scanf_s("%2d",&age);
        switch (age)
        {
        case 5:
            printf("奖励iphone一台!\n");
            break;
        case 10:
            printf("奖励名牌化妆品一套!\n");
            break;
        case 15:
            printf("奖励爱马仕包一个!\n");
            break;
        default:
            printf("抱歉, 未满足奖励条件或者超出工龄!!\n");
            break;
            }
        break;    
    }
    return 0;
}

循环控制语句

循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。

C 提供了下列的循环控制语句。点击链接查看每个语句的细节。

控制语句 描述
break 语句 终止循环switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。
continue 语句 告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。
goto 语句 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。

continue 语句

C 语言中的 continue 语句有点像 break 语句。但它不是强制终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

对于 for 循环,continue 语句执行后自增语句仍然会执行。对于 whiledo...while 循环,continue 语句重新执行条件判断语句。

#include 
 
int main ()
{
   /* 局部变量定义 */
   int a = 10;

   /* do 循环执行 */
   do
   {
      if( a == 15)
      {
         /* 跳过迭代 */ 
         a = a + 1;		// a等于16
         continue;		// 跳过此次循环(不执行下面程序) 重新执行while判断
      }
      printf("a 的值: %d\n", a);
      a++;
     
   }while( a < 20 );
 
   return 0;
}

结果

a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19

你可能感兴趣的:(C语言随笔,c语言,算法,开发语言)