ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c基础语法03

2022-03-20 19:37:08  阅读:137  来源: 互联网

标签:左到 03 双目 基础 运算符 语法 整型 printf 表达式


c基础语法03

1. 算术运算符

1. 算术运算符

C 语言通过提供大量的运算符来支持我们对数据进行处理,前边我们将一个值存放到变量中,使用的是赋值运算符,就是等于号(=),上节课对字符串中的某个字符进行索引,使用方括号([])作为下标运算符实现。

这一节我们谈的是 C 语言中最常用的运算符——算数运算符。

img

这里有几点要跟大家说一下:

  • 因为键盘上没有乘号和除号两个按键,所以用星号(*)和斜杠(/)代替,这几乎是潜规则了。
  • 对于整数间的除法是采取直接舍弃小数部分的方式,而不是什么四舍五入噢。
  • 对于浮点数间的除法则能获得一个相对逼近结果的值(如果除不尽或位数特别多的话)。
  • 百分号(%)在这里是表示求余数的意思,但求余运算符要求两边的操作数都要是整数,其结果也是整数。

2. 何谓“目”?

大家可能看到有些运算符后边写双目,有些写单目,那么什么是目呢?

我们把被运算符作用的运算对象称之为操作数,比如 1 + 2,那么 1 和 2 就是被加法运算符(+)作用的两个操作数。我们说一个运算符是双目运算符还是单目运算符,就是看它有多少个操作数。

3. 表达式

用运算符和括号将操作数连接起来的式子,我们称之为表达式。

  • 1 + 1
  • 'a' + 'b'
  • a + b
  • a + 'b' + pow(a, b) * 3 / 4 + 5

4. 运算符的优先级和结合性

注1:优先级相同的运算符,运算次序由结合性决定。

  • 比如 3 * 4 / 5 % 6,其中乘号、除号和求余运算符在同一优先级,结合性是“左到右”,因此先计算 3 * 4,再计算 / 5,最后计算 % 6
  • 再如 -i++,符号和自增运算符在同一优先级,结合性是“右到左”,因此 -i++ 相当于 -(i++)

注2: 目运算符是指操作数的个数,比如单目运算符只有一个操作数,双目运算符有两个操作数,而三目运算符则有三个操作数。*

注3:通过使用小括号可以提升表达式的优先级至最高。

  • 比如 (1 + 2) * (3 - 4),其中加号、减号运算符的优先级本身是要低于乘号运算符的,但由于使用了小括号,且结合性均是“左到右”,所以先计算 (1 + 2),再计算 (3 - 4),最后才将前两者的结果相乘
#include <stdio.h>
#include <math.h>

int main()
{
    int i,j,k;

    i= 1+2;
    j= 1+2*3;
    k= i + j + -1 + pow(2,3);

    printf("i=%d\n",i);//3
    printf("j=%d\n",j);//7
    printf("k=%d\n",k);//17

    return 0;
}
优先级 运算符 含义 使用形式 **结合性 ** 说明
1 [ ] 数组下标 数组名[整型表达式] 左到右 →
( ) 圆括号 (表达式)
. 成员选择(对象) 对象.成员名
-> 成员选择(指针) 对象指针->成员名
++ 自增运算符 变量名++ 单目运算符
-- 自减运算符 变量名-- 单目运算符
2 - 负号运算符 -表达式 右到左← 单目运算符
(类型) 强制类型转换 (数据类型)表达式 单目运算符
++ 自增运算符 ++变量名 单目运算符
-- 自减运算符 --变量名 单目运算符
* 取值运算符 *指针表达式 单目运算符
& 取地址运算符 &左值表达式 单目运算符
! 逻辑非运算符 !表达式 单目运算符
~ 按位取反运算符 ~表达式 单目运算符
sizeof 长度运算符 sizeof 表达式或sizeof(类型) 单目运算符
3 / 表达式 / 表达式 左到右→ 双目运算符
* 表达式 * 表达式 双目运算符
% 余数(取模) 整型表达式 % 整型表达式 双目运算符
4 + 表达式 + 表达式 左到右→ 双目运算符
- 表达式 - 表达式 双目运算符
5 << 左移 表达式 << 表达式 左到右→ 双目运算符
>> 右移 表达式 >> 表达式 双目运算符
6 > 大于 表达式 > 表达式 左到右→ 双目运算符
>= 大于等于 表达式 >= 表达式 双目运算符
< 小于 表达式 < 表达式 双目运算符
<= 小于等于 表达式 <= 表达式 双目运算符
7 == 等于 表达式 == 表达式 左到右→ 双目运算符
!= 不等于 表达式 != 表达式 双目运算符
8 & 按位与 整型表达式 & 整型表达式 左到右→ 双目运算符
9 ^ 按位异或 整型表达式 ^ 整型表达式 左到右→ 双目运算符
10 | 按位或 整型表达式 | 整型表达式 左到右 → 双目运算符
11 && 逻辑与 表达式 && 表达式 左到右 → 双目运算符
12 || 逻辑或 表达式 || 表达式 左到右 → 双目运算符
13 ?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 ← 三目运算符
14 = 赋值运算符 变量 = 表达式 右到左 ← 双目运算符
/= 除后赋值 变量 /= 表达式 双目运算符
*= 乘后赋值 变量 *= 表达式 双目运算符
%= 取模后赋值 变量 %= 表达式 双目运算符
+= 加后赋值 变量 += 表达式 双目运算符
-= 减后赋值 变量 -= 表达式 双目运算符
<<= 左移后赋值 变量 <<= 表达式 双目运算符
>>= 右移后赋值 变量 >>= 表达式 双目运算符
&= 按位与后赋值 变量 &= 表达式 双目运算符
^= 按位异或后赋值 变量 ^= 表达式 双目运算符
|= 按位或后赋值 变量 |= 表达式 双目运算符
15 , 逗号运算符 表达式1,表达式2,表达式3,… 左到右 →

5. 类型转换

当一个运算符的几个操作数类型不同时,编译器需要将它们转换为共同的某种数据类型,才能进行运算。

#include <stdio.h>

int main()
{
    printf("整型输出:%d\n",1+2.0);//0
    printf("浮点型输出:%f\n",1+2.0);//3.000000

    return 0;
}

通常情况下,编译器会将占用坑位比较小的操作数,先转换为与坑位较大的操作数的相同类型,然后再进行运算。这样做的目的就是为了确保计算的精确度。

除了编译器帮你自动转换不同类型的操作数之外,C 语言还允许你强制转换操作数的数据类型。做法就是在操作数的前边用小括号将目标数据类型括起来。

#include <stdio.h>

int main()
{
    printf("整型输出:%d\n",1+(int)2.0);//整型输出:3
    printf("浮点型输出:%f\n",1+2.0);//浮点型输出:3.000000
    printf("整型输出:%d\n",1+(int)1.8);//整型输出:2
    printf("整型输出:%d\n",1+(int)0.8);//整型输出:1

    return 0;
}

2. 关系运算符和逻辑运算符

1. 关系运算符

在 C 语言中,使用关系运算符来比较两个数的大小关系。

img

关系运算符都是双目运算符,其结合性均为左到右。另外,关系运算符的优先级低于算术运算符,高于赋值运算符。
2. 关系表达式

用关系运算符将两边的变量、数据或表达式连接起来,称之为关系表达式:

  • 1 < 2 // 1
  • a > b // 看具体变量
  • a <= 1 + b // 看具体变量
  • 'a' + 'b' <= 'c' //97+98 <= 99 ----->0
  • (a = 3) > (b = 5) // 0

关系表达式得到的值是一个逻辑值,即判断结果为“真”或“假”,如果结果为“真”,关系表达式的值为 1,如果为“假”,关系表达式的值则为 0。

#include <stdio.h>

int main()
{
    int a = 5,b = 3;
    printf("%d\n",1<2);
    printf("%d\n",a>b);
    printf("%d\n",a<=b+1);
    printf("%d\n",'a'+'b'<='c');
    printf("%d\n",(a=3)>(b=5));
                        // 1
                        // 1
                        // 0
                        // 0
                        // 0

    return 0;
}

3. 逻辑运算符

C 语言总共提供了三种逻辑运算符:

img
4. 逻辑表达式

用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式:

  • 3 > 1 && 1 < 2
  • 3 + 1 || 2 == 0
  • !(a + b)
  • !0 + 1 < 1 || !(3 + 4)
  • 'a' - 'b' && 'c'

注:关系表达式和逻辑表达式得到的值都是一个逻辑值,也就是表示真的 1 和表示假的 0。但是用于判断一个值是否为真时,以 0 表示假,以任何非 0 的数表示真。一个是编译系统告诉我们的结果,一个是我们让编译系统去判断的,两者方向不同。

#include <stdio.h>

int main()
{
    int a = 5,b = 3;

    printf("%d\n",3 > 1 && 1 < 2);
    printf("%d\n",3 + 1 || 2 == 0);
    printf("%d\n",!(a + b));
    printf("%d\n",!0 + 1 < 1 || !(3 + 4));
    printf("%d\n",'a' - 'b' && 'c');
                                // 1
                                // 1
                                // 0
                                // 0
                                // 1

    return 0;
}

5. 短路求值

短路求值又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。

C 语言对于逻辑与和逻辑或采用短路求值的方式。

#include <stdio.h>

int main()
{
     int a = 3, b = 3;
     int i = 0, j = 0,m = 0,n = 0,l = 0;
     i=(a = 0) && (b = 5);

     printf("%d\n",i);
     printf("a = %d, b = %d\n", a, b);
     
     j=(a = 1) && (b = 5);
     printf("%d\n",j);
     printf("a = %d, b = %d\n", a, b);

     m=(a = 2) || (b = 6);
     printf("%d\n",m);
     printf("a = %d, b = %d\n", a, b);

     l=(a = 0) || (b = 6);
     printf("%d\n",l);
     printf("a = %d, b = %d\n", a, b);

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

     return 0;
}

标签:左到,03,双目,基础,运算符,语法,整型,printf,表达式
来源: https://www.cnblogs.com/tantao0-0/p/16031082.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有