在C ++中,表达式中使用的操作数必须是相同的类型(如果不是,则提升一个操作数以匹配另一个操作数。)
我的问题是:我可以假设任何表达式的返回类型总是与其操作数的类型匹配,还是这个规则有例外?例如是这样的情况:
typeY typeYVar = typeXVar / typeXVar2;
尽管两个操作数均为typeX
,但我假设此表达式将返回typeY
值。
注意:我说的是原始类型。
编辑: 我指的是最终类型的操作数,即在执行促销(如果有)之后在它们上(促销是否使操作数的类型相同,或者因为char / short / etc需要被提升为int)。
答案 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"
答案 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类型。转换的结果将被转换,以便进行分配。
某些操作确实涉及隐式转换(例如,如果划分不同类型的两个变量,则有关于促销如何发生的特定规则)