【C语言】/*操作符(上)*/

目录

一、算数操作符:+、-、*、/、%

1.1 + 和 -

1.2 * 

1.3 / 

1.4 % 

二、赋值操作符:= 和符合赋值

2.1 连续赋值

2.2 复合赋值(自操作)

三、单目操作符:++、--、+(正号)、-(负号)

3.1 ++ 和 --  

3.1.1 前置++

3.1.2 后置++

3.1.3 前置--

3.1.4 后置--

3.2 正号(+) 和负号(-)

四、强制类型转换

五、关系操作符

六、条件操作符

七、逻辑操作符:&&、||、!

7.1 逻辑取反运算符

7.2 与运算符

7.3 或运算符

7.4 短路


一、算数操作符:+、-、*、/、%

1. 算术操作符分别是: +、-、*、/、%,这些操作符都是双⽬操作符(有两个操作数)

2. 注:操作符也被叫做运算符,是不同的翻译,意思是⼀样的。

 1.1 + 和 -

1. + 和 - 用来完成加法和减法。

2. 示例代码如下图:

1.2 * 

1. 运算符 * ⽤来完成乘法。

2. 示例代码如下图:

1.3 / 

1. 运算符/⽤来完成除法,除号的两端如果是整数,执⾏的是整数除法,得到的结果是商

2. 示例代码如下图:

3. 上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是 1.5 ,原因就在于 C 语⾔⾥⾯的整数除法计算的结果是商,余数部分被被丢弃。

4. 如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法

5. 示例代码如下图:

5. 示例代码如下图:

6. 上⾯的代码,你可能觉得经过运算, score 会等于 25 ,但是实际上 score 等于 0 。这是因为 score / 20 采用的是整数除法,(score / 20)会得到⼀个整数值 0 ,所以乘以 100 后得到的也是 0 。 为了得到预想的结果,可以将除数 20 改成 20.0 ,让整数除法变成浮点数除法。

1.4 % 

1. 运算符 % 表⽰取模运算,即返回两个整数相除的余值;这个运算符只能⽤于整数,不能⽤于浮点数。

2. 示例代码如下图:

3. 负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定

4. 示例代码如下图:

5. 上⾯⽰例中,第⼀个运算数的正负号( 11 或 -11 )决定了结果的正负号。

二、赋值操作符:= 和符合赋值

1. 在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值

    int a = 100;//初始化

    a = 200;//赋值,这⾥使⽤的就是赋值操作符

2. 赋值操作符 = 是⼀个随时可以给变量赋值的操作符

2.1 连续赋值

1. 赋值操作符也可以连续赋值,如:

    int a = 3;

    int b = 5;

    int c = 0;

    c = b = a+3;//连续赋值,从右向左依次赋值的。

2. C语⾔虽然⽀持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样⽅便观察代码的执⾏细节。 

2.2 复合赋值(自操作)

1. 在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:

    int a = 10;

    a = a+3;

    a = a-2;

2. 这样代码C语⾔给提供了更加⽅便的写法:

    int a = 10;

    a += 3;

    a -= 2;

3. C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:

    +=、-=、*=、 /=、 %=

    >>=、<<=、 &=、 |=、^=

三、单目操作符:++、--、+(正号)、-(负号)

1. C语⾔中还有⼀些操作符只有⼀个操作数,被称为单⽬操作符。 ++、--、+(正)、-(负) 就是单⽬操作符的

3.1 ++ 和 --  

1. ++是⼀种⾃增的操作符,⼜分为前置++和后置++,--是⼀种⾃减的操作符,也分为前置--和后置--。

2. 单独写前置和后置表达的效果是一样的,例如:++a 和 a++ 表达的都是a自加1。

3.1.1 前置++

1. int a = 10;

    int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++

    printf("a=%d b=%d\n",a , b);

2. 计算⼝诀:先+1,后使⽤;

3. a原来是10,先+1,后a变成了11,再使⽤就是赋值给b,b得到的也是11,所以打印的结果,a和b都是11,上面的代码相当于这样的代码:

    int a = 10;

    a = a+1;

    b = a;

    printf("a=%d b=%d\n",a , b);

3.1.2 后置++

1. int a = 10;

    int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++

    printf("a=%d b=%d\n",a , b);

2. 计算⼝诀:先使⽤,后+1;

3. a原来是10,先使⽤,就是先赋值给b,b得到了10,然后再+1,然后a变成了11,所以打印的结果 a是11,b是10,上面的代码相当于这样的代码:

    int a = 10;

    int b = a;

    a = a+1;

    printf("a=%d b=%d\n",a , b);

3.1.3 前置--

1. 计算⼝诀:先-1,后使⽤;

2. int a = 10;

    int b = --a;//--的操作数是a,是放在a的前⾯的,就是前置--

    printf("a=%d b=%d\n",a , b);//输出的结果是:9 9

3.1.4 后置--

1. 计算⼝诀:先使⽤,后-1;

2. int a = 10;

    int b = a--;//--的操作数是a,是放在a的后⾯的,就是后置--

    printf("a=%d b=%d\n",a , b);//输出的结果是:9 10

3.2 正号(+) 和负号(-)

1. 这⾥的+是正号,-是负号,都是单⽬操作符。

2. 运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。

    int a = +10; 等价于 int a = 10;

3. 运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负数。但是int a = --10;//err,--会被认为是前置--,且--操作符的操作数必须是可修改的值,而不能是常量,写成int a = -+10是可以的。

    int a = 10;

    int b = -a;

    int c = -10;

    printf("b=%d c=%d\n", b, c);//这⾥的b和c都是-10

    int a = -10;

    int b = -a;

    printf("b=%d\n", b); //这⾥的b是10

四、强制类型转换

1. 语法形式:(类型)

2. int a = 3.14; //a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告

3. 为了消除这个警告,我们可以使⽤强制类型转换:int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分

4. 俗话说,强扭的⽠不甜,我们使⽤强制类型转换都是万不得已的时候使⽤,如果不需要强制类型转化 就能实现代码,这样⾃然更好的。

五、关系操作符

1. C 语⾔⽤于⽐较的表达式,称为“关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有下⾯6个:

     >      ⼤于运算符

     <      ⼩于运算符

    >=     ⼤于等于运算符

    <=     ⼩于等于运算符

    ==     相等运算符

    !=      不相等运算符

2. 关系表达式的结果为真返回1,为假返回0

3. C 语⾔中,0 表⽰假,所有⾮零值表⽰真,例如,20 > 12 返回 1 ,12 > 20 返回 0 。

4. 关系表达式常⽤于 if 或 while 结构。

    if (x == 3)

    {

           printf("x is 3.\n");

    }

5. 注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写 出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。

    if (x = 3) ...

6. 上⾯⽰例中,原本的意思是 x == 3 ,但是不⼩⼼写成 x = 3,此时这个式⼦表⽰对变量 x 赋值3 ,它的返回值为 3 ,所以 if 判断总是为真。 为了防⽌出现这种错误,有的程序员喜欢将变量写在相等运算符的右边,例如 if (3 == x) ... 这样的话,如果把 == 误写成 = ,编译器就会报错,因为赋值表达式的左边必须是可以修改的左值

    /* 报错 */

    if (3 = x) ...

7. 另⼀个需要避免的错误是:多个关系运算符不宜连⽤

    i < j < k //err

8. 上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式

    (i < j) < k

9. 上⾯式⼦中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤下⾯的写法

    i < j && j < k

10. ⽐如:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年,如果我们这样写,当我们输⼊10 的时候,依然输出⻘年。

    #include <stdio.h>

    int main()

   {

             int age = 0;

             scanf("%d", &age);

             if(18<=age<=36)

             {

                       printf("⻘年\n");

             }

             return 0;

   }

11. 这是因为,我们先拿 18 和 age 中存放的10⽐较,表达式18<=10为假, 18<=age 的结果是0,再拿 0 和 36⽐较,0<=36为真,所以打印了⻘年,所以即使当age是10的时候,也能打印⻘年 ,逻辑上是有问题的,修改代码如下。

12.  #include <stdio.h>

       int main()

      {

              int age = 0;

              scanf("%d", &age);

              if(age>=18 && age<=36)

              {

                       printf("⻘年\n");

              }

             return 0;

      }

六、条件操作符

1. 条件操作符也叫三⽬操作符(C语言中唯一的三目操作符),需要接受三个操作数的,形式如下:exp1 ? exp2 : exp3

2. 条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算计算的结果是整个表达式的结果

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > 5)
		b = 3;
	else
		b = -3;//上面四行代码可以直接写成:b = a > 5 ? 3 : -3;
	printf("%d\n", b);
	return 0;
}
//使⽤条件表达式实现找两个数中较⼤值
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int m = a > b ? a : b;
	printf("%d\n", m);
	return 0;
}

七、逻辑操作符:&&、||、!

1. 逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。

    ! :逻辑取反运算符(改变单个表达式的真假),单目操作符

   && :与运算符,就是并且的意思(一假则假)

    || :或运算符,就是或者的意思(一真则正)

 7.1 逻辑取反运算符

1. ⽐如,我们有⼀个变量叫 flag,如果flag为假,要做⼀个什么事情,就可以这样写代码:

     #include <stdio.h>

     int main()

     {

            int flag = 0;

            if(!flag)

            {

                    printf("do something\n");

            }

            return 0;

     }

2. 如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真 所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。

7.2 与运算符

1. && 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假

2. ⽐如:如果我们想表示⽉份是3⽉到5⽉,是春天。

    int month = 0; 

    scanf("%d", &month);

    if (month >= 3 && month <= 5)

    {

           printf("春季\n");

    }

3. month >= 3 && month <= 5 这⾥表达的意思就是 month 既要⼤于等于3,⼜要⼩于等于5,必须同时满⾜。 

7.3 或运算符

1. || 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b ,|| 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假

2. ⽐如:如果我们想表示⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天。

    int month = 0;

    scanf("%d", &month);

    if(month == 12 || month==1 || month == 2)

    {

           printf("冬季\n");

    }

//输⼊⼀个年份year,判断year是否是闰年
//闰年判断的规则:
//1. 能被4整除并且不能被100整除是闰年
//2. 能被400整除是闰年
int main()
{
	int year = 0;
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		printf("是闰年\n");
	return 0;
}

 7.4 短路

1. C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为“短路”。

2. if(month >= 3 && month <= 5)

3. 上面的表达式中&& 的左操作数是 month >= 3 ,右操作数是 month = 3 的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季),所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏

4. if(month == 12 || month==1 || month == 2)

5. 上面的表达式中如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季),所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数

6. 练习:阅读代码,计算代码输出的结果

    #include <stdio.h>
    int main()
   {
           int i = 0, a = 0, b = 2, c = 3, d = 4;
           i = a++ && ++b && d++;
          //i = a++||++b||d++;
          printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);//1 2 3 4
         return 0;
}

   本篇文章已完结,谢谢支持哟 ^^ !!!

  • 48
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值