C/C++ 第二讲 数据类型、运算符和表达式

2.1 数据类型

变量

先定义再使用;先赋值再计算

int a, b, c ;

初始化:定义同时赋值

  • 数据类型 变量名=表达式;
    • int k=3, m=3, n(3);
    • 不能连写(int k=m=n=3),需逐个进行初始化。
  • 数据类型 变量名(表达式); (C++)

常量

种类:

  • 值常量
    • 5、3.14
    • ‘a’ 字符常量
    • “abcd” 字符串常量
  • 符号常量
    • 定义方式:
    • const 数据类型 标识符 = 常量;
      • const double PI = 3.14;
    • #define 标识符 常量值
      • #define N 100
      • 注意用define时名与值之间用空隔分开;末尾不带分号。

值常量再分:

  • 整型常量

    • 十进制
    • 1~9开始,由0~9组成
    • 八进制
    • 以数字0开始,由0~7组成
    • 十六进制
    • 以0x或0X开始,由0~9A~F组成
  • 实型常量

    • 十进制小数形式
    • 指数形式
    • 由尾数、指数符号(e或E)、指数构成
      • 1.25e-5
    • 要求:
      • e前尾数不能省,e后指数必须为整数
      • 指数不能加圆括号

符号常量再分:

  • 普通字符常量
    • 单引号引起来的单个字符,可在屏幕上直接显示
  • 转义字符常量
    • \开头用单引号括起的**字符序列**,如'\n'(换行符),'\t'(横向制表符),'\0'(字符串结束)
  • 字符串常量
    • 双引号括起的字符序列,系统在该常量尾自动加字符串结束符'\0'

说明:

  • 字符型数据在系统内存以ASCII码存储
    • ‘A’-65, ‘a’-97, ‘0’-48
  • 大小写互换
    • char ch = ch+'A'-'a'(小变大)
  • 一定范围内的整型与字符型数据可相互转换
    • char ch = ‘a’ - 32
    • char x; x=rand()%26+65;
  • ‘\0’与’0’不同,前者是字符串结束符,ASCII码0;后者是数字字符,ASCII码48.
  • 字符常量‘a’与字符串常量”a”不同,前者占1个字节,后者占2个字节,末尾隐含’\0’
  • “abcd”长度4,占字节5(\0)

similarly:

若输入字符串“ABC”,下面程序段的输出为(C)。

1
2
3
char c;
while(cin>>c,c!=’\n’)
cout<<c+2;

A.222 B.CDE C.676869 D.333

标识符 考点

标识符:

字母、数字和下划线三种字符组成,且必须以字母或下划线开头

关键字不能作为用户定义的标识符。

用户定义标识符:

合法: char2 _abc a3 P1

不合法: int p[i] break 3a a+b class public

常量:

合法: '\n' '\102 ' '\t ' '\72'

不合法: ‘ABC’ (不是单引号引起来的单个字符) 1.2e0.5(指数必须为整数) M '[]'

2.2 运算符和表达式的基本概念

运算符

基本概念

  • 优先级(15)
  • 结合性(优先级相同时的运算符连续运算顺序)
    • 自左向右
    • 自右向左
  • 目数(运算符所需操作数,通常目数少优先级高)
    • 单目
    • 双目(+-*/)
    • 三目

常用运算符种类

相同目数的各运算符优先顺序:

算术>关系>逻辑>条件(三目)>赋值(双目)>逗号

表达式

概念

常量、变量、函数调用、运算符构成

要点

  • 与数学表达式的区别
    • (a-b*c)/(x-y*z)乘号不能省
    • 只能加圆括号

2.3 算术运算符

算术运算种类:

+ - * /(整除) %(求余) ++ --(自增、自减)

优先级:

  • ++``--``+``-(取正、负)
  • *``/``%
  • +``-
整数相除:
  • 两个操作数都是整数时,商也为整数,小数部分舍去。
  • 如果要求精确结果,需将其中一个变为实数,如:a*1.0/b
求余运算(%):
  • 两操作数必须皆为整型

  • 结果的符号与被除数一致

    • a%b = a - a/b*b

    应用:

    判断

自增、自减运算符(++、–):
  • 只能作用于(整型)变量

  • 前置或后置运算 (a++;–a)

    • 前置、后置区别:
    • 对自增、自减变量本身值无区别;
    • 参与的表达式贡献不同
      • 前置运算以变化后的值参与运算
      • 后置运算以原值参与运算

典例:

假设有: a=0,b=6,c=7,则表达式 a++&&b++&&c++运算完成后,整个表达式的值为 false( 0), a 的值为 1, b 和 c 保持原值不变。

这是因为“ a++” 作为后置自增运算, 以原值 0 参与“ &&”运算,使得整个表达式的值为 0,后续的“ b++” 和“ c++”没有被执行。

--a&&++b;++a--b;也是同理。

2.4 关系运算符和逻辑运算符

关系运算符

“判断关系”

种类:

==(等于)、!=(不等于)

<(小于)、<=(小于等于)、>(大于)、>=(大于等于)

  • 运算结果为“真”(1)和“假”(0)

关系运算符的优先级低于算术运算符,共有 6 种,分别为:

优先级为 6 的:>(大于) >=(大于等于) <(小于) <=(小于等于)

优先级为 7 的:==(等于) !=(不等于)

逻辑运算符

  • 逻辑非(!)
  • 逻辑与(&&)(取交集)
  • 逻辑或()(取并集)

说明:

  • 运算数可为任意类型,如关系表达式;
  • 所有非0数均做“真”处理(当作1)

如:x>=0 && x<=100

  • 只要可唯一确定值,逻辑运算即不再进行
    • --a&&b++&&c--只会做–a,已经为0,可唯一确定运算值为0

2.5 赋值运算符、条件运算符、逗号运算符

赋值运算符

种类:

  • 简单赋值运算符(=):

    • 将右边表达式的值送入左边变量
  • 复合赋值运算符:

    • 将左边变量与右边表达式的值的和(差、积、商、余数)送入左边变量
    • +=、-=、*=、/=、%=、……

特点:

  • 左端只能为变量或数组元素,不能为表达式或常量。
    • 反例:a=b+2=c+5
  • 两端类型不同时系统自动将右端类型转换为左端类型。
    • 例:int a=3.78,则a=3
    • 结合性自右向左
    • a=(b=(c=1)))

条件运算符(? :)

形式:

e1? e2: e3

e1, e2, e3代表三个表达式

执行过程:

e1的值若非0,结果取e2;

e1的值若为0,结果取e3。

例1:

max = (x>y) ? x:y

例2:n人分班,每班k人

numclass = (n%k==0)? n/k: n/k+1

逗号运算符(,)

形式:

e1, e2, e3

e1, e2, e3代表三个表达式

执行过程:

从左向右依次计算每个表达式的值;整个表达式的值为最右边表达式的值。

例:

c=(a=10, b=20, a+b),则c=30

应用:

for语句中,用于连接多个表达式

for(i=0, j=n; i<j; i++, j--)

2.6 类型转换运算

自动类型转换

  • 允许值从一种类型转换为另一种类型
  • 赋值运算右端类型转换为左端类型
  • 其他运算从低到高转换成同一种类型后再运算
    • char(字符型), short(短整型)–>int(整型)–>unsigned(无符号整型)–>long(长整型)–>float(单精度实型)–>double(双精度实型)
    • 其中char–>int, float–>double是必然的
1
2
3
4
5
6
char c1, int k;
c1='A';
k=c1+2; //这里c1已经char变int了,=65
c1=c1+2;
cout<<c1<<ends<<k;
//c=67, k=67

强制类型转换

形式

(类型标识符) 表达式类型标识符 (表达式)

说明

得到一个新类型的数据,但原变量类型不变。

例1:

in i; float d=3.5; i=(int)d

则i=4, d=3.5

例2:将三位小数x四舍五入到百分位

x = (int)(x*100+0.5)/100.0

100.0:得到小数部分

  • 强制类型转换符是单目运算符,优先级高于所有双目运算符:
1
2
3
float a=3.5, b=2;
c=(int)a*b
//c=6.0

2.7 指针

2.8 typedef语句

2.9 应用

  • setw()用于斜输出,需要#include <iomanip>
1
2
setfill("*")  //设置填充字符
setw(6) //只对后面第一个对象起效

eg.输出三位整数的正负号、百位数、十位数、个位数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <iomanip>
#include <math.h>
int main()
{
int c1,c2,c3;
char c4;
int x;
cin>>x;
c4=x>=0?'+':'-';
x=abs(x);
c1=x/100;
c3=x%10;
c2=x/10; //x==0停止
cout<<“数符 百位数 十位数 个位数”<<endl;
cout<<setw(2)<<c4<<setw(8)<<c1<<setw(8)<<c2<<setw(8)<<c3<<endl;
system("pause");
return 0;
}