|
基本表达式(Primary expressions)
基本表达式通常作为其它表达式的基本构件而存在。基本表达式包括以下几种:
被声明为对象类型或者函数类型的标识符是表达式的一个基本构件,因此,这两种类型的标识符是基本表达式。进一步地,若一个标识符被声明为对象类型,则它是一个左值;若被声明为函数类型,则它是一个函数指示符。参见“声明”、“左值”、“函数指示符”和“标识符”。以下是左值和函数指示符的示例。
- int a = 0, f (int, int);
- a = a + 3; //运算符=两边的a都是指示对象的基本表达式
- f (); //这里的f是指示一个函数的基本表达式
复制代码
常量也是表达式的基本构件,因此,它也是一种基本表达式。常量表达式的类型和它的值以及该常量的字面形式有关。例如,2ULL表示一个unsigned long long int类型的常量,其值为2。有关常量的话题可参见词条“常量”。下例中, 'x' + 2LL是常量的表达式。
- 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]是使用了字面串的表达式。
- char c = "Primary Expression" [0];
复制代码
可以用括号来改变运算符的优先级和结合性,这是大家都知道的。如果一个表达式以“(”开始,以“)”结束,中间是另一个表达式(可以是任意一个表达式),那么这样的一个表达式称为括住的表达式。
例如,要构建一个赋值表达式,则运算符=两边的操作数要求是赋值表达式及之前的表达式,即:
但是,这并不意味着不能使用那些在表达式列表(参见词条“表达式列表”)中,位于赋值表达式之后的表达式,你只需要为它们加上括号,使之成为基本表达式,如:
如果不使用括号来构建基本表达式,则上面的赋值表达式会变为条件表达式(因为运算符=优先与x和y结合),如:
括住的表达式被看作基本表达式,它的类型和值与去掉括号后的表达式是一样的。给定以下声明:
- int x, y = 0, f (void);
- void g ();
复制代码
则下面的语句中使用了括住的表达式:
- (x) = (y) + 1; //等价于x = y + 1;
- (f) (); //等价于f ();
- ((g) ()); //等价于g ();
复制代码
以上,因为x和y都是左值,所以(x)和(y)也是左值;因为f是函数指示符,所以(f)也是函数指示符;因为g是函数指示符,故(g)依然是函数指示符,(g)()是void表达式,所以((g)())也是void表达式。
|
|