(long) i + (int) j * k 表达式的类型是什么?

(long) i + (int) j * k What is the type of the expression?

int i;
long j;
unsigned int k;

我是 C 语言的新手,不懂这个。我曾多次尝试在网上寻找类似的表达方式。老实说,我不需要答案,我真的只是想了解如何弄清楚。这与混合数据类型有关,我只遇到了很少的关于它们是什么的信息,但没有什么可以清楚地理解的。任何帮助将不胜感激,以了解如何找出以下表达式的数据类型 (long) i + (int) j * k

感谢您的回答!谢谢!

我们有 long + int * unsigned.

* 表达式将为 unsigned。原因是intunsigned的转换等级相同,无符号类型胜出:有符号操作数转换为无符号,两个unsigned之间相乘,其结果为那种类型的。

因此,加法就是long + unsigned。这里事情变得棘手。如果实现的 long 可以表示 unsigned 的所有值,那么 unsigned 将被转换为 long;加法是两个 long 个操作数,结果是 long。但是如果 unsigned 的值超出 long 范围(例如 32 位 unsigned 和 32 位 long),那么两个操作数都将转换为 unsigned long 并且添加将是那种类型。

换句话说,类型最终是platform-specific,取决于unsignedlong的相对范围。

查看 。然后将其与运算符优先级一起使用来确定哪些操作数相互绑定 - 类型提升将针对每个子表达式,然后每个子表达式的结果类型成为下一个的操作数。

乘法自然比加法具有更高的优先级,并且强制转换仍然具有更高的优先级,因此表达式等同于:

((long)i) + ( ((int)j) * k )

在括号内的子表达式中,有一个jint的显式转换,然后通常的算术转换按照上面的link 确定用于该子表达式的类型。它也成为在确定用于添加的类型时使用的结果类型。再一次,它是通常的算术转换。

其他答案告诉您如何使用 C 标准找出类型,但如果您只想知道针对您的特定编译器和编译器设置的答案是什么,请尝试编译此无效代码:

int i;
long j;
unsigned int k;

void foo()
{
  char * x = (long) i + (int) j * k;
}

您将收到一条警告,内容如下:

warning: initialization of 'char *' from 'long int' makes pointer from integer without a cast [-Wint-conversion]

这条错误消息告诉我们,编译器已经决定赋值 right-hand 端的类型是 long int.