【问题标题】:Assign min Value to char C++将最小值分配给 char C++
【发布时间】:2012-03-25 21:28:35
【问题描述】:

我正在尝试将 char 的最小值分配给这样的 char 数组类型的变量

char charchar_value[MAX_VARCHAR_LENGTH + 1]= CHAR_MIN;

它给了我这个错误“将‘char’分配给‘char [513]’时的类型不兼容”

【问题讨论】:

  • 您没有 char 类型的变量;你有一个字符数组。
  • 那不是char 变量,那是char array 变量。
  • 你想做什么?就像现在一样,您正在创建一个数组并尝试使用 char 对其进行初始化。
  • 您的变量不是“char 类型”。相反,它的类型是char[MAX_VARCHAR_LENGTH + 1]

标签: c++ char variable-assignment min


【解决方案1】:

数组对象的初始化需要使用大括号初始化列表,即类似于

char charchar_value[MAX_VARCHAR_LENGTH + 1] = { val_0, val_1, /*...*/ val_n };

这会将第一个 n 值初始化为其各自的值,并将所有其他值初始化为零。这不是你想要的。在数组中设置值的唯一方法是在其初始化之后,使用例如std::fill():

std::fill(std::begin(charchar_value), std::end(charchar_value),
          std::numeric_limits<char>::min());

由于有另一个建议建议使用本质上是 C 方法:

  • memset() 的使用仅限于没有任何 C++ 功能的类型(char 确实如此),并且当将值设置为 0 以外的其他值时,它几乎仅限于 char (是的,我意识到在某些情况下它仍然有效)。另一方面,std::fill() 适用于任何可复制分配的类型以及赋予相应类型对象的任何值。
  • 虽然在这种情况下使用sizeof() 有效,但在大小变为动态时它就不起作用,但编译器仍然会很乐意接受代码。获取指针的std::begin()std::end() 将失败。
  • 在不完全知道类型的上下文中,例如当它是 typedef 或在模板中时,std::numeric_limits&lt;T&gt;::min() 有更好的工作机会。它仍然不适用于许多类型,因为没有定义min(),但范围更大。

说了这么多,我只需要使用适当的类来直接进行初始化,即

std::vector<char> charchar_value(MAX_VARCHAR_LENGTH + 1,
                                 std::numeric_limits<char>::min());

不过,这会动态分配内存,也就是说,它并不完全等价。但是,除非有充分的理由假设其他情况,否则我会使用简单的方法,并且仅在必要时进行优化。

【讨论】:

    【解决方案2】:

    如果您只想将第一个元素设置为CHAR_MIN,那么它将是:

    char charchar_value[MAX_VARCHAR_LENGTH + 1] = { CHAR_MIN };
    

    如果您想将整个数组初始化为CHAR_MIN,那么它将是:

    char charchar_value[MAX_VARCHAR_LENGTH + 1];
    
    memset(charchar_value, CHAR_MIN, sizeof(charchar_value));
    

    【讨论】:

    • 哎呀! memset()?当然你的意思是std::fill(std::begin(charchar_value), std::end(charchar_value), std::numeric_limits&lt;char&gt;::min());
    • @DietmarKühl - 没什么。请告诉我你的舌头藏在脸颊里???您可能不喜欢这种风格,但使用 memset、CHAR_MIN 或 sizeof() 并没有本质上的错误或不安全性。一些喜欢更简洁语法的人会看到你的“更现代”的交叉示例,并且对 Paul 的相同厌恶。
    • @phonetagger:不,我是认真的!如果有更通用和安全的方法可用,为什么要教任何人一种相当有限的方法(请参阅我的答案以供参考)。
    • @DietmarKühl - 我很欣赏你的回答,我赞成。我唯一的问题是“yikes”,好像保罗的回答有缺陷、不安全或不可移植。假设它满足了 OP 问题的需求,那么它没有任何缺陷、不安全或不可移植。
    【解决方案3】:

    确定 C++ 中以下数据类型的最小值和最大值:

    g)  char
    h)  int
    i)  float
    j)  double
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 2023-04-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多