04运算符,表达式和语句
一、运算符
1单目运算符
+(正号运算符)
-(负号运算符)
2赋值运算符
=
int a = 1;
读法:将1赋值给a
= 左边必须是一个变量,因为不能将一个值赋给一个常量
左侧是目标类型,计算机会转成左侧一样的类型
定义变量时要防止数据溢出
如果只是声明了变量,未赋值,则编译器会默认赋予声明的变量一个值(-858993460)。
赋值表达式和赋值语句:
- 赋值表达式的末尾没有分号,而赋值语句有分号
- 一个表达式可以包含赋值表达式,但决不能包含赋值语句
复合赋值运算符
> += -= *= /= %
int a = 12;
int a += 12;//相当于 a = a + 12;
int a -= 12;
int a *= 12;
int a /= 12;
int a %= 12;
3算术运算符
+ - * / %
a = b + 1;
a = b - 1;
a = b * 1;
a = b / 1;//取整
a = b % 1;//取余
a = (3 + 2) * 5;
printf("%d %d %d %d %d",f + 4, 1 + 2, 2 - 1,3 * 5, 6 / 2, 7 % 2,(3+4)*2);
除法中注意:
- 分母不能为0,取余时不能为浮点数
- 负数参与除法运算,VC++采取向零取整。例-5/3 = -1
% 运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。如8%3,结果为2.
小练习:拆分整数
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int b = 2345;
printf("%d",b % 10);//5
printf("%d", b / 10 % 10);//4
printf("%d", b / 10 / 10 % 10);//3
printf("%d", b /1000);//2
system("pause");
return 0;
}
自加自减
++ –
int main(void)
{
int a = 12, b = 12;
int c = a++;
int d = ++b;
printf("%d, %d",a, c);//13,12
printf("%d, %d",b, d);//13,13
}
++操作符后置,先运算再自增;++操作符前置,先自增再运算;自减同理
(其实上边这句话不对,因为++运算符比=优先级高,但是可以得出正确的结果!)
注意点:
❗ 同一个变量的自加自减在同一条语句中尽量只用一次,不同编译器得到的结果不一样.例如:
int b = a++ + ++a + a++;//❌
printf("%d %d %d", a, a++, ++a);//❌
❗ 当下边语句中出现了++后,该变量的值就变了
int a = 1;
int b = a++;
printf("%d %d", a, b);//2 1
4逗号运算符
运用:
- 在for循环中:
for(int i = 0,int j = 2; i < 5; i++)
j++;
- 作分隔符使用:
printf("%d", num);
scanf("%ld",&number);
- 作为逗号表达式:
x =(y = 3,(z = ++y + 2) + 5);
//效果是首先把y赋值为3,把y递增为4,然后把4加上2,把结果6赋值给z,接下来把z加5,最后把x赋为结果值11。
int number = 249, 450;
//249是左子表达式,而450是右子表达式,而整个表达式的值是右子表达式的值即450
5关系运算符
> < = > <= >= == !=
每个关系运算符都把它左边的值与它右边的值进行比较。
一个简单的关系表达式由一个关系运算符及其两侧的操作数组成。如果关系为真,关系表达式的值为1;如果关系为假,关系表达式的值为0。
6逻辑运算符
&& :两者都为真则真
|| :一假则为假
!:取相反
逻辑表达式是从左到右求值的,一旦发现有使表达式为假的因素,立即停止求值。
5 > 2 && 4 > 7//flase
5 > 2 || 4 > 7//ture
!(4 > 7)//ture
if(range >=90 && range <= 100)//✔
printf("Good show!\n");
if(90 <= range <= 100)//❌
printf("Good show!\n");
🎈改变拼写法:
C99标准为逻辑运算符增加了可供选择的拼写法:
他们在iso646.h头文件里定义,如果包含了这个头文件,就可以用and,or,not来分别代替他们
传统的 | ISO646.h |
---|---|
&& | and |
|| | or |
! | not |
if(ch != '"' and ch !='\'')
charcount++;
7条件运算符
? :
expression1 ? expression2 : expression3
如果expression1为真,整个表达式的值为expression2,否则为expression3.
(5 > 3) ? 1 : 2//1
(a > b) ? a : b//取最大值
8位运算符
<< >> ~ | ^ &
9求字节数运算符
sizeof
给出它右边的操作数的字节大小。操作数可以是在圆括号里的一个类型说明符,或者具体的变量、数组的名字
例如:
sizeof(float);
sizeof foo;
10强制类型转换运算符
(类型名)(表达式)
作为指派运算符,它将跟在它后面的值转换成由圆括号里的关键字所指定的类型。
- (double)a 将a转换成double类型
- (int)(x + y) 将x + y的值转换成int型
- float(5%3) 将5%3的值转换成float型
有两种类型转换;
- 系统自动进行的类型转换
- 强制类型转换
11成员运算符
.
->
(减号和一个大于号)
//.应用举例:结构体变量引用
struct Date
{
int day;
int month;
int year;
} today;
today.day = 1;
today.month = 15;
today.year = 2021;
//->应用举例:访问结构体类型数组成员
struct Date
{
int day;
int month;
int year;
};
struct Date today, *pDate;
pDate = &today;
pDate -> day = 1;
pDate -> month = 15;
pDate -> year = 2021;
12下标运算符
[]
也是变址运算符
13函数调用运算符
()
14指针运算符
*
指针变量定义时,*
是指针说明符,表示其后面的变量是一个指针变量;使用指针变量时,*
是取内容运算符,表示取得指针所指向的变量的值。&取地址运算符,作用是取得&后面的变量的地址。&符号后能接任何类型的变量
混合运算
计算机只能对同种类型的数据进行运算,不同类型的混合运算,系统要先进行转换,才能运算。
类型转换就可能造成内存截断,这个结果可能是错误的,或者我们不想要的。
- +、-、*、/ 运算的两个数中有一个数为float或double型,结果是double型。系统将float型数据都先转换为double型,然后进行运算。
- 如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型
- 字符型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算
优先级
二、表达式
含义:表达式是一个运算符和操作数的组合。(操作数是运算符操作的对象)
举例:
4
2 + 3
q = 5 * 2
q > 7
三、语句
语句是构造程序的基本成分。一条语句是一条完整的计算机指令。
程序是一系列带有某种必需的标点的语句集合。
分为简单语句和复杂语句,简单语句以一个分号结束,例如
声明语句:int toes;
赋值语句:toes = 12;
函数调用语句:printf("%d\n", toes);
结构化语句:while( toes < 20 ) toes = toes + 2;
空语句: ;//什么都不做
复合语句或代码块,由一个或多个括在花括号里的语句(这些语句本身也可能是复合语句)构成,例如:
while(years < 100)
{
wisdom = wisdom * 1.05;
printf("%d %d \n",wisdom);
years = years + 1;
}