繁体   English   中英

C 语言,在赋值中做隐式转换

[英]The C language, does implicit conversion in assignments

C 语言在赋值中进行隐式转换,从较小的类型到较大的类型以及从较大的类型到较小的类型,是吗?

#include <stdio.h>

int main(void) {
   int x = 5;
   long y = x; // conversion implicit ?

   long a = 12;
   int b = a; // conversion implicit ?
   return 0;
}

另一件事,您是否在使用赋值运算符时用语言标准编写了有关转换的内容?

我将尝试正式解释 C 标准的内容。 我们可以从阅读 6.5.16.1/2 开始:

简单赋值(=)中,将右操作数的值转换为赋值表达式的类型,并替换存储在左操作数指定的 object 中的值。

简单的赋值意味着= ,而不是像+=这样的各种复合赋值

上述转换仅在赋值是有效形式时才会发生。 有一个包含所有 forms 个有效作业的列表(您不需要阅读它,为了完整起见,我将其包含在此处):

6.5.16.1 简单赋值

约束条件

满足以下条件之一:

  • 左操作数具有原子、限定或非限定算术类型,右操作数具有算术类型;
  • 左操作数具有与右操作数兼容的结构或联合类型的原子、限定或非限定版本;
  • 左操作数具有原子、限定或非限定指针类型,并且(考虑左操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,并且 left 指向的类型具有所有右边指向的类型的限定符;
  • 左操作数具有原子、限定或非限定指针类型,并且(考虑左操作数在左值转换后将具有的类型)一个操作数是指向 object 类型的指针,另一个是指向限定或非限定版本的指针void,左边指向的类型具有右边指向的类型的所有限定符;
  • 左边的操作数是一个原子的、限定的或非限定的指针,右边的是一个 null 指针常量; 或者
  • 左侧操作数的类型为原子、限定或非限定 _Bool,右侧是指针。

如果某类赋值不在该列表中,则为“约束违规”,表示无效 C,编译器必须发出有关它的消息。

如果该列表中有赋值,则右操作数将隐式转换为左操作数的类型。 在你的情况下long y = x; , 它符合列表中的第一个项目符号:左操作数是算术类型(整数或浮点数),右操作数也是算术类型。 所以int操作数x在赋值时被转换为long


关于预选赛:

所有关于“限定类型”的东西都是指const等类型限定符。 在赋值过程中,会发生称为左值转换的事情。 6.5.16/3:

赋值表达式的类型是左操作数在左值转换后的类型。

如果您不知道什么是“左值转换”,则帮助不大。 正式定义在 6.3.2.1/2 中找到,但它对初学者同样没有帮助。 简而言之,左值转换意味着无论右操作数具有什么限定符( constvolatile等),它都会被转换为与左操作数具有相同的限定符。 “左值”一词实际上来源于“赋值运算符的左值”。

据我所知,您可以使用打印语句并查看有关类型的警告。

#include <stdio.h>

int main(void) {
   int x = 5;
   printf("%d ",x);
   long y = x; // conversion implicit ?
   printf("%d ",y);


   long a = 12;
   printf("%ld ",a);
   int b = a; // conversion implicit ?
   printf("%ld ",b);
   return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM