找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 649|回复: 0

基本表达式(Primary expressions)

[复制链接]

416

主题

315

回帖

3288

积分

管理员

积分
3288
发表于 2024-3-11 16:10:32 | 显示全部楼层 |阅读模式
基本表达式(Primary expressions)




基本表达式通常作为其它表达式的基本构件而存在。基本表达式包括以下几种:
  • 标识符
  • (各种)常量
  • 字面串
  • 泛型选择
  • 括住的表达式

被声明为对象类型或者函数类型的标识符是表达式的一个基本构件,因此,这两种类型的标识符是基本表达式。进一步地,若一个标识符被声明为对象类型,则它是一个左值;若被声明为函数类型,则它是一个函数指示符。参见“声明”、“左值”、“函数指示符”和“标识符”。以下是左值和函数指示符的示例。
  1. int a = 0, f (int, int);
  2. a = a + 3;                //运算符=两边的a都是指示对象的基本表达式
  3. f ();                        //这里的f是指示一个函数的基本表达式
复制代码


常量也是表达式的基本构件,因此,它也是一种基本表达式。常量表达式的类型和它的值以及该常量的字面形式有关。例如,2ULL表示一个unsigned long long int类型的常量,其值为2。有关常量的话题可参见词条“常量”。下例中, 'x' + 2LL是常量的表达式。
  1. long long ago = 'x' + 2LL;
复制代码


其中,'x'和2LL都是典型的常量,前者是字符常量,后者是整型常量。这里要顺便讨论一下类型提升的话题。ago的类型是long long int,在赋值之前,需要先计算运算符“=”右边的表达式,并将结果转换为long long int类型。
但是,在运算符=的右侧, 'x'和2LL的类型不同,'x'的类型是int,2LL的类型是long long int,后者的转换阶高于前者,所以需要先将'x'的类型提升为long long int,然后计算出相加的结果。结果的类型也是long long int,和对象ago的类型相同,不必再做转换即可直接赋值。

表达式的基本构件还包括字面串,所以字面串也是基本表达式,而且是数组类型的左值。有关字面串的话题可参见词条“字面串”。例如下例中,"Primary Expression" [0]是使用了字面串的表达式。
  1. char c = "Primary Expression" [0];
复制代码


可以用括号来改变运算符的优先级和结合性,这是大家都知道的。如果一个表达式以“(”开始,以“)”结束,中间是另一个表达式(可以是任意一个表达式),那么这样的一个表达式称为括住的表达式。
例如,要构建一个赋值表达式,则运算符=两边的操作数要求是赋值表达式及之前的表达式,即:
  1. x = y ++
复制代码


但是,这并不意味着不能使用那些在表达式列表(参见词条“表达式列表”)中,位于赋值表达式之后的表达式,你只需要为它们加上括号,使之成为基本表达式,如:
  1. x = (y ? 0 : 1)
复制代码


如果不使用括号来构建基本表达式,则上面的赋值表达式会变为条件表达式(因为运算符=优先与x和y结合),如:
  1. x = y ? 0 : 1
复制代码


括住的表达式被看作基本表达式,它的类型和值与去掉括号后的表达式是一样的。给定以下声明:
  1. int x, y = 0, f (void);
  2. void g ();
复制代码


则下面的语句中使用了括住的表达式:
  1. (x) = (y) + 1;        //等价于x = y + 1;
  2. (f) ();            //等价于f ();
  3. ((g) ());         //等价于g ();
复制代码


以上,因为x和y都是左值,所以(x)和(y)也是左值;因为f是函数指示符,所以(f)也是函数指示符;因为g是函数指示符,故(g)依然是函数指示符,(g)()是void表达式,所以((g)())也是void表达式。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-12-22 09:31 , Processed in 0.222108 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表