想象一下两个正整数A和B.我想将这两个整数组合成一个整数C.
可能没有其他整数D和E组合为C.因此将它们与加法运算符组合不起作用.例如30 + 10 = 40 = 40 + 0 = 39 + 1连接也不起作用.例如"31"+"2"= 312 ="3"+"12"
这种组合操作也应该是确定性的(总是在相同的输入下产生相同的结果)并且应该总是在整数的正侧或负侧产生整数.
在这个答案中,我基本上需要static int n = -1;一个函数。我想避免到处都是幻数,所以我改用了这个:
double f(int i)
{
static const int sentinel = -1;
static int n = sentinel;
if (n == sentinel)
// ...
}
Run Code Online (Sandbox Code Playgroud)
然而有人指出,这不符合标准,因为sentinel它不是(编译时)常量。
这对我来说很有意义,因为我知道在 C++ 的编译时表达式(例如数组的大小)中可以使用常量整数。然而,gcc、clang 和 icc >v16 编译此代码时没有任何警告。只有 icc <=v16 和 MSVC 给出了这个警告/错误(参见Godbolt)。
C标准怎么说?这在不同版本的标准(c90、c99、c11)之间会发生变化吗?如果这不符合,我们可以在 gcc 和 clang 上得到警告吗?如果符合,为什么旧的 icc 和 MSVC 会出错?