c++ - 'short int'持有的值溢出了,但 'auto'没有?

标签 c++ g++

#include <iostream>

using namespace std;

int main()
{
    unsigned long maximum = 0;
    unsigned long values[] = {60000, 50, 20, 40, 0};
    
    for(short value : values){
        cout << "Current value:" << value << "\n";

        if(value > maximum)
            maximum = value;
    }
    cout << "Maximum value is: " << maximum;
    
    cout << '\n';
    return 0;
}
输出为:
Current value:-5536
Current value:50
Current value:20
Current value:40
Current value:0
Maximum value is: 18446744073709546080
我知道我不应该在short循环内使用for,最好使用auto,但是我只是想知道,这是怎么回事?
我相信Ubuntu与g++ 9.3.0一起使用。

最佳答案

问题是到达元素short value时的60000
这太大了,无法在您的平台上放入short,因此short溢出,实现定义的结果。
在您的情况下似乎正在发生的事情是,60000环绕至负-5536,然后(以明确定义的方式)转换为unsigned long,在您的情况下为264-5536:这等于程序显示的最大值。
一种解决方法是使用惯用语

for(auto&& value: values){

关于c++ - 'short int'持有的值溢出了,但 'auto'没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62896195/

相关文章:

c++ - 禁用按钮功能(Wx 小部件)

c++ - 匿名 union 中类成员的初始化

c++ - 指向静态成员函数的指针是 "invalid"作为 g++ 的模板参数

c++ - 在 Linux 上使用 g++ 链接静态英特尔 IPP 库时出现问题

c++ - g++ 问题 : exception not caught

c++ - c++11 中的模板化 union

c++ - 如何解决库间包含依赖关系?

c++ - 变量改变它的值

c++ - 重载 operator== 提示 'must take exactly one argument'

c++ - 警告 : conversion to 'double' from 'long int' may alter its value