我有一个代码定义了一个简单的枚举类型,然后循环遍历它以打印相应的音节。
#include <stdio.h>
typedef enum syllable
{
Do=1, Re=2, Mi=3, Fa=4, So=5, La=6, Ti=7
} Syllable;
void Sound(Syllable sy)
{
switch (sy)
{
case Do:
puts("Do"); return;
case Re:
puts("Re"); return;
case Mi:
puts("Mi"); return;
case Fa:
puts("Fa"); return;
case So:
puts("So"); return;
case La:
puts("La"); return;
case Ti:
puts("Ti"); return;
}
puts("Sing together~");
}
int main(void)
{
Syllable tone;
for (tone=Do; tone<Ti; tone++)
Sound(tone);
return 0;
}
但是,此代码在第
no 'operator++(int)' declared for postfix '++' [-fpermissive]
行的编译中引发错误 tone++
。我在这里做错了什么,我该如何解决才能正确循环 Syllable?
看来您正在将代码编译为 C++ 代码。
来自C++14标准(5.2.6自增自减)
1 后缀 ++ 表达式的值是其操作数的值。 [ 注:获取的值是原始值的副本——尾注】 操作数应为可修改的左值。操作数的类型 应为算术类型或指向完整对象的指针 类型。
和(3.9.1 基本类型)
7 类型 bool、char、char16_t、char32_t、wchar_t,以及有符号和 无符号整数类型统称为整数类型。
和
8 共有三种浮点类型:float、double、long 双倍的。 double 类型至少提供与 float 一样多的精度, 并且 long double 类型提供的精度至少与 双倍的。 float 类型的值集是 double 类型的值; double 类型的值集是 long double 类型的值集的子集。价值 浮点类型的表示是实现定义的。 整数和浮点类型统称为算术类型。 标准模板 std::numeric_limits 的特化 (18.3) 应指定每个算术的最大值和最小值 类型实现
如您所见,枚举不包含在 C++ 的算术类型中。所以枚举的后缀增量运算符在 C++ 中没有定义。
另一方面,在 C 中(The C Standard (6.5.2.4 Postfix increment and decrement operators)
约束
1 后缀递增或递减运算符的操作数应 具有原子的、合格的或不合格的实数或指针类型,并且应 是一个可修改的左值。
和(6.2.5类型)
17 Tchar 类型、有符号和无符号整数类型,以及 枚举类型统称为整数类型。整数 和真正的浮动类型统称为真正的类型。
在 C 中,枚举包含在整数类型族中,相应地包含在定义了后缀增量运算符的实数类型族中。
因此将您的代码编译为 C 代码。
在 C++ 中,您需要显式重载后缀增量运算符作为用户定义的函数,例如
Syllable operator ++( Syllable &e, int )
{
Syllable tmp = e == Ti ? Do : static_cast<Syllable>( e + 1 );
e = e == Ti ? Do : static_cast<Syllable>( e + 1 );
return tmp;
}
使用 Enum Class 或仅作为 C 编译。使用 gcc 构建
如果你使用 VScode,使用 Code-Runner Extention 会有帮助。
试试
$gcc {filename} -o {outfilename}
使用允许您在 C 中编译的编译器,您也可以在各种在线编译器上尝试它。