(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
。原因是int
和unsigned
的转换等级相同,无符号类型胜出:有符号操作数转换为无符号,两个unsigned
之间相乘,其结果为那种类型的。
因此,加法就是long + unsigned
。这里事情变得棘手。如果实现的 long
可以表示 unsigned
的所有值,那么 unsigned
将被转换为 long
;加法是两个 long
个操作数,结果是 long
。但是如果 unsigned
的值超出 long
范围(例如 32 位 unsigned
和 32 位 long
),那么两个操作数都将转换为 unsigned long
并且添加将是那种类型。
换句话说,类型最终是platform-specific,取决于unsigned
和long
的相对范围。
查看 。然后将其与运算符优先级一起使用来确定哪些操作数相互绑定 - 类型提升将针对每个子表达式,然后每个子表达式的结果类型成为下一个的操作数。
乘法自然比加法具有更高的优先级,并且强制转换仍然具有更高的优先级,因此表达式等同于:
((long)i) + ( ((int)j) * k )
在括号内的子表达式中,有一个j
到int
的显式转换,然后通常的算术转换按照上面的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
.
int i;
long j;
unsigned int k;
我是 C 语言的新手,不懂这个。我曾多次尝试在网上寻找类似的表达方式。老实说,我不需要答案,我真的只是想了解如何弄清楚。这与混合数据类型有关,我只遇到了很少的关于它们是什么的信息,但没有什么可以清楚地理解的。任何帮助将不胜感激,以了解如何找出以下表达式的数据类型 (long) i + (int) j * k
感谢您的回答!谢谢!
我们有 long + int * unsigned
.
*
表达式将为 unsigned
。原因是int
和unsigned
的转换等级相同,无符号类型胜出:有符号操作数转换为无符号,两个unsigned
之间相乘,其结果为那种类型的。
因此,加法就是long + unsigned
。这里事情变得棘手。如果实现的 long
可以表示 unsigned
的所有值,那么 unsigned
将被转换为 long
;加法是两个 long
个操作数,结果是 long
。但是如果 unsigned
的值超出 long
范围(例如 32 位 unsigned
和 32 位 long
),那么两个操作数都将转换为 unsigned long
并且添加将是那种类型。
换句话说,类型最终是platform-specific,取决于unsigned
和long
的相对范围。
查看
乘法自然比加法具有更高的优先级,并且强制转换仍然具有更高的优先级,因此表达式等同于:
((long)i) + ( ((int)j) * k )
在括号内的子表达式中,有一个j
到int
的显式转换,然后通常的算术转换按照上面的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
.