C++入门很轻松(微课超值版)
上QQ阅读APP看书,第一时间看更新

4.3 使用表达式

微视频

在C++语言中,表达式是由运算符和操作数构成的,运算符指出了对操作数的操作,操作数可以是常量、变量或是函数的调用,并且表达式是用来构成语句的基本单位。本节介绍表达式的使用。

4.3.1 算术表达式

由算术运算符和操作数组成的表达式称为算术表达式,算术表达式的结合性为自左至右。常用的算术表达式及使用说明如表4-11所示。

表4-11 算术表达式及使用说明

【实例4.10】编写程序,定义int型变量a、b、c,初始化a的值为10,初始化b的值为20,使用算术表达式对a和b进行运算,将运算结果分别赋予c再输出(源代码\ch04\4.10.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
           int a = 10;
           int b = 20;
           int c ;
           /* +运算 */
           c= a + b;
           printf("a+b=%d\n", c );
           /* -运算 */
           c= a - b;
           printf("a-b=%d\n", c);
           /* *运算 */
           c = a * b;
           printf("a*b=%d\n", c );
           /* /运算 */
           c = a / b;
           printf("a/b=%d\n", c );
           /* %运算 */
           c= a % b;
           printf("a%%b=%d\n", c );
           /* 前置++运算 */
           c = ++a;
           printf("++a=%d\n", c);
           /* 前置--运算 */
           c= --a;
           printf("--a=%d\n", c );
           return 0;
    }

程序运行结果如图4-10所示。

图4-10 例4.10的程序运行结果

在使用算术表达式的过程中,应该注意以下几点。

(1)在算术表达式中,如果操作数的类型不一致,系统会自动进行隐式转换,如果转换成功,表达式的结果类型以操作数中表示范围大的类型为最终类型,如3.2+3,其结果为double类型的6.2。

(2)减法运算符的使用同数学中的使用方法类似,但需要注意的是,减法运算符不但可以应用于整型、浮点型数据间的运算,还可以应用于字符型的运算。在字符型运算时,首先将字符转换为其ASCII码,然后进行减法运算。

(3)在使用除法运算符时,如果除数与被除数均为整数,则结果也为整数,默认会把小数舍去(并非四舍五入),如3/2=1。

4.3.2 赋值表达式

由赋值运算符和操作数组成的表达式称为赋值表达式,赋值表达式的功能是计算表达式的值再赋予左侧的变量。赋值表达式的一般格式如下:

    变量 赋值运算符 表达式

C++语言中常见的赋值表达式及使用说明如表4-12所示。

表4-12 常见赋值表达式及使用说明

【实例4.11】编写程序,定义int型变量x和y,使用赋值表达式对x进行相应的运算操作,然后将结果赋予y并输出(源代码\ch04\4.11.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
           int x,y;
           x=2;
           printf("x = %d\n",x);
           /* 基本赋值 */
           y = x;
           printf("计算y = x\n");
           printf("y = %d\n", y );
           /* +=运算符 */
           y += x;
           printf("计算y += x\n");
           printf("y = %d\n", y );
           /* -=运算符 */
           y -= x;
           printf("计算y -= x\n");
           printf("y = %d\n", y );
           /* *=运算符 */
           y *= x;
           printf("计算y *= x\n");
           printf("y = %d\n", y );
           /* /=运算符 */
           y /= x;
           printf("计算y /= x\n");
           printf("y = %d\n", y );
           /* %=运算符 */
           y = 3;
           y %= x;
           printf("计算y %%= x(y=3)\n");
           printf("y = %d\n", y );
    }

程序运行结果如图4-11所示。

图4-11 例4.11的程序运行结果

在使用赋值表达式的过程中,应该注意以下几点。

(1)左操作数必须是一个变量,C++语言中可以对变量进行连续赋值。这时赋值运算符是右关联的,这意味着从右向左运算符被分组。例如,a=b=c的表达式等价于a=(b=c)。

(2)如果赋值运算符两边的操作数类型不一致,存在隐式转换,系统会自动将赋值号右边的类型转换为左边的类型再赋值;如果不存在隐式转换,那就先要进行显式类型转换,否则程序会报错。

4.3.3 关系表达式

由关系运算符和操作数构成的表达式称为关系表达式。关系表达式中的操作数可以是整型、实型、字符型等。对于整型、实型和字符型,前述6种比较运算符(见表4-3)都可以使用;而对于字符串型,比较运算符实际上只能使用“==”和“!=”。关系表达式的格式如下:

    表达式 关系运算符 表达式

例如:

    3>2
    z>x-y
    'a'+2<d
    a>(b>c)
    a!=(c==d)
    "abc"!="asf"

☆大牛提醒☆

当两个字符串的值都为null或两个字符串长度相同、对应的字符序列也相同(非空字符串)时,比较的结果才能为“真”。

关系表达式的返回值只有“真”与“假”两种,分别用“1”和“0”来表示。例如:

    2>1/*返回值为“真”,也就是“1”*/
    (a+b)==(c=5)/*返回值为“假”,也就是“0”*/

【实例4.12】编写程序,通过输入端输入一个字符,使用关系表达式判断该字符是字母还是数字(源代码\ch04\4.12.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
       /* 定义变量 */
       char ch;
       printf("请输入一个字符:\n");
       ch=getchar();
       /* 根据不同情况进行判断 */
       if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
       {
               printf("%c 是一个字母。\n",ch);
       }
       else if(ch>='0' && ch<='9')
       {
               printf("%c 是一个数字。\n",ch);
       }
       else
       {
               printf("%c 属于其他字符。\n",ch);
       }
    }

保存并运行程序,如果输入数值8,则返回如图4-12所示的结果;如果输入一个字母a,则返回如图4-13所示的结果。

图4-12 输入数字

图4-13 输入字母

4.3.4 逻辑表达式

由逻辑运算符和操作数组成的表达式称为逻辑表达式。逻辑表达式的结果只能是真或假,即要么是“1”,要么是“0”。逻辑表达式的一般格式如下:

    表达式 逻辑运算符 表达式

例如,表达式a&&b,其中a和b均为布尔值,系统在计算该逻辑表达式时,首先判断a的值,如果a为true,再判断b的值;如果a为false,系统不需要继续判断b的值,直接可确定表达式的结果为false。

虽然在C++语言中以“1”表示“真”,以“0”表示“假”,但在判断一个量是为“真”或是为“假”时,则是以“0”代表“假”,以非“0”的数值代表“真”。例如,2&&3,由于“2”和“3”均非“0”,所以该表达式的返回值为“真”,即为“1”。

【实例4.13】编写程序,分别定义char型变量s并初始化为'z',定义int型变量a、b、c并初始化为1、2、3,定义float型变量x和y并初始化为2e+5和3.14,然后输出由它们所组合的相应逻辑表达式的返回值(源代码\ch04\4.13.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
       /* 定义变量 */
       char s='z';
       int a=1,b=2,c=3;
       float x=2e+5,y=3.14;
       /* 输出逻辑表达式的返回值 */
       printf("结果一:");
       printf( "%d,%d\n", !x*y, !x );
       printf("结果二:");
       printf( "%d,%d\n", x||a&&b-5, a>b&&x<y );
       printf("结果三:");
       printf( "%d,%d\n", a==2&&s&&(b=3), x+y||a+b+c );
       return 0;
    }

程序运行结果如图4-14所示。

图4-14 例4.13的程序运行结果

4.3.5 位运算表达式

由位运算符和操作数构成的表达式称为位运算表达式。在位运算表达式中,系统首先将操作数转换为二进制数,进行位运算后,再将结果转换为十进制数整数。各种位运算表达式及使用说明如表4-13所示(这里假设操作数1为8,操作数2为3)。

表4-13 位运算符表达式

【实例4.14】编写程序,定义unsigned int型变量a、b并初始化为20、15,定义int型变量c并初始化为0,对a、b进行相关位运算操作,然后将结果赋予变量c并输出(源代码\ch04\ 4.14.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
         /* 定义变量 */
         unsigned int a = 20;                 /* 20 = 0001 0100 */
         unsigned int b = 15;                 /* 15 = 0000 1111 */
         int c = 0;
         printf("a 的值为:%d,b 的值为:%d\n",a,b);
         /* 位运算 */
         c = a & b;                           /* 4 = 0000 0100 */
         printf("a & b 的值是 %d\n", c );
         c = a | b;                           /* 31 = 0001 1111 */
         printf("a | b 的值是 %d\n", c );
         c = a ^ b;                           /* 27 = 0001 1011 */
         printf("a ^ b 的值是 %d\n", c );
         c = ~a;                             /*-21 = 1110 1011 */
         printf("~ a 的值是 %d\n", c );
         c = a << 2;                          /* 80 = 0101 0000 */
         printf("a << 2 的值是 %d\n", c );
         c = a >> 2;                          /* 5 = 0000 0101 */
         printf("a >> 2 的值是 %d\n", c );
         return 0;
    }

程序运行结果如图4-15所示。

图4-15 例4.14的程序运行结果

4.3.6 条件表达式

由条件运算符组成的表达式称为条件表达式。其一般表示格式如下:

    条件表达式?表达式1:表达式2

条件表达式的计算过程是先计算条件,然后进行判断。如果条件表达式的结果为“真”,计算表达式1的值,表达式1为整个条件表达式的值;否则,计算表达式2,表达式2为整个条件表达式的值。例如,求a和b中最大数的表达式。

    a>b?a:b  //取a和b的最大值

条件运算符的优先级高于赋值运算符,低于关系运算符和算术运算符。所以有:

    (a>b)?a:b等价于a>b?a:b

条件运算符的结合性规则是自右向左,例如:

    a>b?a:c<d?c:d等价于a>b?a:(c<d?c:d)

注意:在条件运算符中“?”与“:”是一对运算符,不可拆开使用。

【实例4.15】编写程序,定义两个int型变量,通过输入端输入两变量的值,再使用条件表达式比较它们的大小,将较大数输出(源代码\ch04\4.15.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
          /*定义两个int型变量 */
          int x, y;
          printf("请输入两个整数,以比较大小:\n");
          cin>>x>>y;
          /* 使用条件表达式比较两数大小 */
          printf("两数中较大的为:%d\n", x>y?x:y);
    }

程序运行结果如图4-16所示。

图4-16 例4.15的程序运行结果

4.3.7 逗号表达式

逗号运算符的功能是将两个表达式连接成一个表达式,这就是逗号表达式。逗号表达式的一般格式如下:

    表达式1,表达式2

上述逗号表达式的运算方式为分别对两个表达式进行求解,然后以表达式2的计算结果作为整个逗号表达式的值。此外,在逗号表达式中可以使用嵌套的形式。例如:

    表达式1,(表达式2,表达式3,…,表达式n)

将上述逗号表达式展开,可以得到:

    表达式1,表达式2,表达式3,…,表达式n

那么表达式n便为整个逗号表达式的值。

【实例4.16】编写程序,定义int型变量a、b、c、x、y,对变量a、b、c进行初始化,它们的值分别为1、2、3,然后计算逗号表达式y=(x=a+b,a+c),最后输出x和y的值(源代码\ch04\4.16.txt)。

    #include <iostream>
    using namespace std;
    int main()
    {
          /* 定义变量 */
          int a=1,b=2,c=3,x,y;
          /* 逗号表达式 */
          y=(x=a+b,a+c);
          printf("整个逗号表达式的值为y=%d\n",y);
          printf("表达式1的值为x=%d\n",x);
    }

程序运行结果如图4-17所示。

图4-17 例4.16的程序运行结果