表达式的返回类型是否始终与操作数类型匹配?

时间:2015-01-24 22:02:35

标签: c++ c types

在C ++中,表达式中使用的操作数必须是相同的类型(如果不是,则提升一个操作数以匹配另一个操作数。)

我的问题是:我可以假设任何表达式的返回类型总是与其操作数的类型匹配,还是这个规则有例外?例如是这样的情况:

typeY typeYVar = typeXVar / typeXVar2;

尽管两个操作数均为typeX,但我假设此表达式将返回typeY值。

注意:我说的是原始类型。


编辑: 我指的是最终类型的操作数,即在执行促销(如果有)之后在它们上(促销是否使操作数的类型相同,或者因为char / short / etc需要被提升为int)。

3 个答案:

答案 0 :(得分:3)

是的,这绝对是可能的 - 例如,当您使用需要整体促销的表达式时:

char a = 'a', b = 'b';
int c = a + b; // Operator + promotes a and b to int
cout << typeid(a+b).name() << endl; // prints "i"

Demo.

答案 1 :(得分:3)

一个明显的反例是指针加法和减法:

const char *p = "Hello, world!";
const char *q = p + 1; // operands of type const char * and int, neither is converted to the other
auto diff = q - p; // two operands of type const char *, result has type ptrdiff_t

关系运算符是另一个明显的反例:

auto cmp = 1.23 < 4.56; // two operands of type double, result has type bool (or int in C)

答案 2 :(得分:0)

表达式的评估很大程度上与存储结果的变量类型无关。

如果我们这样做

int x = 4;
int y = 3;
long long z;
z = x/y;

表达式的结果&#34; x / y&#34;是int类型(值为1)。然后将该值1转换为long long类型(产生1LL)。

在进行除法之前,x和y都不会被隐式转换(或提升)为long类型。转换的结果将被转换,以便进行分配。

某些操作确实涉及隐式转换(例如,如果划分不同类型的两个变量,则有关于促销如何发生的特定规则)