GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同

What does GCC compiler do to type conversion? Why the output on mac and linux are different?

本文关键字:Linux 输出 mac 为什么 类型转换 编译器 什么 作用 GCC      更新时间:2023-10-16

我在作用域中对变量b(范围外的声明(进行了类型转换,并为b提供了一个新的val,当作用域结束时,b的val似乎是错误的。

这发生在我的Macbook上,哪个版本的gcc是gcc-8(自制GCC 8.3.0(8.3.0。 我在 gcc 版本为 5.4.0 的 linux 笔记本电脑上尝试了相同的代码,并且代码运行良好。

std::vector<int> a = {1,2,3,4};
int b;
{
    size_t i = 0, b = a[i];
    //this time type of b is size_t
    ++i;
    b = a[i];
}
std::cout << "b = " << b << std::endl;

在我的 Mac 上,结果是b = 0在 Ubuntu 16 上,结果是b = 1

两个版本的 gcc 在类型转换上有什么区别?

还是错误?

您没有进行任何类型转换,而是在作用域中创建第二个b,由于它具有相同的名称,因此会遮蔽外部b。这意味着您正在为内部b分配一些内容,而保留外部b不变。一旦作用域结束(在右大括号处(,你就会剩下(未初始化的(外部b,打印它会调用未定义的行为,这正是你正在经历的。

这段代码在语义上是等效的,可能会更好地显示实际发生的情况:

vector<int> a = {1,2,3,4};
int outer_b;
{
    size_t i = 0, inner_b = a[i];
    //this time type of b is size_t
    ++i;
    inner_b = a[i];
}
cout << "b = " << outer_b << endl;