江小南

V1

2022/11/20阅读:9主题:萌绿

【408篇】C语言笔记-第三章(运算符与表达式)

第三章:运算符与表达式

第一节:算数运算符与关系运算符

1. 运算符的分类

C语言提供了13中类型的运算符。

序号 类型 备注
1 算数运算符 + - * / %
2 关系运算符 > < == >= <= !=
3 逻辑运算符 ! && ||
4 位运算符 << >> ~ | ^ &
5 赋值运算符 =及其扩展赋值运算符
6 条件运算符 ? :
7 逗号运算符 ,
8 指针运算符 *和&
9 求字节数运算符 sizeof
10 强制类型转换运算符 (类型)
11 分量运算符 ->
12 下标运算符 [ ]
13 其他运算符 ( )

2. 算数运算符及算数表达式

乘、除、取余运算符的优先级高于加、减运算符。

%为取余(取模)运算符,它接收两个整型操作数,将左操作数除以右操作数,但它返回值是余数而不是商

由算数运算符组成的式子称为算数表达式,表达式一定有一个值。

#include <stdio.h>

int main() {
    int result=4+5*2-6/3+10%4;
    printf("result=%d\n",result);
    return 0;
}
F:\Computer\Project\practice\3\3.2-arithmetic\cmake-build-debug\3_2_arithmetic.exe
result=14

进程已结束,退出代码为 0

3. 关系运算符与关系表达式

由关系运算符组成的表达式称为关系表达式。关系表达式的值只有真和假,对应的值为1和0

C语言中没有布尔类型,0代表假,非0即为真。

关系运算符的优先级低于算数运算符。

判断整型变量i是否等于3时,可以写成3==i,即把常量写在变量的前面,如果少写了一个等号会编译不通,便于发现问题。

编写程序时,如果要判断三个数是否相等,不能将三个数写到一起,if(5=5=5)的写法是错的。正确如下:

#include <stdio.h>

int main() {
    int a;
    while (scanf("%d",&a)){
        if(a>3 && a<10){
            printf("a is between 3 and 10\n");
        } else{
            printf("a is not between 3 and 10\n");
        }
    }
    return 0;
}
F:\Computer\Project\practice\3\3.2-relation\cmake-build-debug\3_2_relation.exe
3
a is not between 3 and 10
5
a is between 3 and 10
m

进程已结束,退出代码为 0

解析:如果写成if(3<a<10),因为关系表达式的值只有0和1,这里a给成多少,3<a要么是0,要么是1,而0和1是小于10的,永远为真。

4. 运算符的优先级

说明:同一优先级的运算符,运算次序由结合方向所决定。

简单记就是:! > 算数运算符 > 关系运算符 > && > || > 赋值运算符。

第二节:逻辑运算符与赋值运算符

1. 逻辑运算符与逻辑表达式

非:!

与:&&

或:||

和数学上的与或非一致。

逻辑非的优先级高于算数运算符,逻辑与和逻辑或的优先级低于关系运算符

对0取非,得到的值为1,对非0值取非,得到的值为0。

逻辑与短路运算是当前面一个表达式为假时,后面的表达式不会执行。逻辑或短路运算是当前面一个表达式为真时,后面的表达式不会执行

#include <stdio.h>

int main() {
    int i=0,j=1;
    while (scanf("%d",&i)){
        if(i%4==0 && i%100!=0 || i%400==0){
            printf("i is leap year\n");
        } else{
            printf("i is not leap year\n");
        }
    }
    i=!!j;
    printf("i=%d\n",i);
    return 0;
}
F:\Computer\Project\practice\3\3.3-leap_year\cmake-build-debug\3_3_leap_year.exe
2000
i is leap year
1000
i is not leap year
m
i=1

进程已结束,退出代码为 0

解析:最后输入了非零的m,第一步!j为0,而后!!j为1。

#include <stdio.h>

int main() {
    int i=0;
    i&& printf("you can not see me\n");
    return 0;
}
F:\Computer\Project\practice\3\3.3-short_circuit\cmake-build-debug\3_3_short_circuit.exe

进程已结束,退出代码为 0

解析:没有任何输出,因为i=0就是假,不执行后面的了,短路。

2. 赋值运算符

左值是那些出现在赋值符号左边的东西,右值是那些可以出现在赋值符号右边的东西。

a=b+25; 是合法的。

b+25=a; 是不合法的。因为b+25并未标识一个特定的位置(并不对应特定的内存空间)。

#include <stdio.h>

int main() {
    int a=1,b=2;
    b+25=a;
    return 0;
}
F:\Computer\Project\practice\3\3.3-logic\main.c:5:9: error: lvalue required as left operand of assignment
     b+25=a;
         ^

符合赋值运算符:

例如:

i=i+5可以写成i+=5;

i=i*5可以写成i*=5;

#include <stdio.h>
// 加后赋值和乘后赋值
int main() {
    int iNum,iResult;
    iNum=10;
    iResult=3;
    iNum+=5;
    iResult*=iNum;
    printf("iNun=%d\n",iNum);
    printf("iResult=%d\n",iResult);
    return 0;
}
F:\Computer\Project\practice\3\3.3-reunite_with\cmake-build-debug\3_3_reunite_with.exe
iNun=15
iResult=45

进程已结束,退出代码为 0

3. 求字节运算符sizeof

用于求常量或变量所占用的空间大小。

#include <stdio.h>

int main() {
    int i=0;
    printf("i sizeof is %d\n",sizeof(i));
    return 0;
}
F:\Computer\Project\practice\3\3.2-sizeof\cmake-build-debug\3_2_sizeof.exe
i sizeof is 4

进程已结束,退出代码为 0

可以看出整型变量占用空间大小为4个字节。

分类:

后端

标签:

C#

作者介绍

江小南
V1