用enum枚举量做下标初始化数组

一下copy自:http://bbs.csdn.net/topics/90234659

-------------------------------------------------------------------------------------------------------------------

“两则C语言技巧”http://tb.blog.csdn.net/TrackBack.aspx?PostId=1120124
第一个技巧在我的环境下不能通过,是我的原因吗。
引用:
1.         数组初始化。

常见的数组初始化方法:

int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

通常情况下,这种做法没有问题。再看看下面这个例子:

enum

{

FRUIT_APPLE,

FRUIT_PEAR,

FRUIT_BANANA,

FRUIT_NR

};

int price[FRUIT_NR] = {20, 25, 30};

这段代码有个潜在前提,那就是枚举的顺序不能变化。一旦变化,整个逻辑都乱了,这样的BUG能否查出来要靠运气。这样的假设是靠不住的,特别是当枚举是第三方库提供的时候,他们调整枚举的顺序后绝对不会通知你。为了避免这样的潜在隐患,可以用下面的方法:

Enum

{

FRUIT_APPLE,

FRUIT_PEAR,

FRUIT_BANANA,

FRUIT_NR

};

int price[FRUIT_NR] = { [FRUIT_APPLE] = 20, [FRUIT_PEAR] = 25, [FRUIT_BANANA] = 30};

而我的测试代码,不行啊:
//用枚举量做下标初始化数组。
#include <iostream>
enum
{
    FRUIT_APPLE,
    FRUIT_PEAR,
    FRUIT_BANANA,
    FRUIT_NR
};
int main()
{
    using namespace std;
    int price1[FRUIT_NR] = {20, 25, 30};
    int price2[FRUIT_NR] =
    {
        [FRUIT_APPLE] = 20,
        [FRUIT_PEAR] = 25,
        [FRUIT_BANANA] = 30
    };

int i = 0;
    cout << "price1:\n";
    cout << "apple, " << price1[i++] << ". ";
    cout << "pear, " << price1[i++] << ". ";
    cout << "banana, " << price1[i] << ". \n";

i = 0;
    cout << "price2:\n"
    cout << "apple, " << price2[i++] << ". ";
    cout << "pear, " << price2[i++] << ". ";
    cout << "banana, " << price2[i] << ". \n";

system("PAUSE");
    return 0;
}
第二个技巧还不错。

时间: 2024-08-11 01:36:03

用enum枚举量做下标初始化数组的相关文章

C# 篇基础知识2——运算符、类型转换、流程控制、枚举、结构体和数组、函数

1.运算符.类型转换 计算某年y某月m某日d是周几的基姆拉尔森公式公式:int week = (d + 2*m + 3*(m + 1)/5 + y + y/4 - y/100 + y/400 + 1)%7; 除了算数运算符,C#还提供了大量数学函数,这些数学函数归为一类,称为Math 类,其常用函数如下表所示: 表 1?7 Math类中的常用函数 功能 函数 C#示例 数学表示 结果 乘方 Math.Pow() Math.Pow(2,3) 23 8 开方 Math.Sqrt() Math.Sqr

中秋佳节--理解Enum枚举

一.Enum枚举的作用 1.使用枚举可以限定取值范围,枚举中定义的每个常量都可以理解为对象: Eg: Public enum Color{ RED, GREEN,BULE; } 说明:RED实际上就表示的是枚举的名称,默认的编号是0,可以使用ordinal()方法获得. 2.使用enum关键字定义枚举类,其中包含的对象可以初始化定义(初始化构造函数) Eg: package cn.test.java.enums; enum ColorDemo{ RED("红色"),GREEN(&quo

c++ 批量初始化数组 fill和fill_n函数的应用

转自c++ 如何批量初始化数组 fill和fill_n函数的应用 std::fill(a+2,a+10,0x3f3f3f3f);///从下标2到下标10 前闭后开 共8个 std::fill_n(a+2,10,0x3f3f3f3f);///从下标2 开始 填充10个 memset(a,0x7f7f7f7f,sizeof(a)); 一. fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val值. 函数参数:fill(first,last,val);//first为容

C语言——enum枚举类型

enum是枚举类型,实际上就是定义一组值,enum定义数据类型的值只能是这一组值中的一个. 在实际生活中,很多问题都与是这样的.如人的性别,只有男女两种:一星期有七天:月份只有十二个值. 如下定义一周七天的值: #include <stdio.h> typedef enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }week; int main() { printf("%d %d %d %d %

获取Enum枚举值描述的几法方法

原文:获取Enum枚举值描述的几法方法 1.定义枚举时直接用中文 由于VS对中文支持的很不错,所以很多程序员都采用了此方案. 缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用英文 2.利用自定义属性定义枚举值的描述(博客园-大尾巴狼) 缺点:不适合多语言 原文:http://www.cnblogs.com/hilite/archive/2006/03/28/360793.html 枚举定义: [EnumDescription("订单.订单中的产品.产品项的状态.&quo

Enum枚举类|注解Annotation

Enum枚举类 ①枚举类和普通类的区别: 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类 枚举类的构造器只能使用 private 访问控制符 枚举类的所有实例必须在枚举类中显式列出(, 分隔    ; 结尾). 列出的实例系统会自动添加 public static final 修饰 ②JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定 ③枚举类的主要方法: valu

Java enum 枚举还可以这么用

在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 1.可以在enum中添加变量和方法 先来看一段代码示例: public enum State { Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4); // 成员

memset初始化数组的坑

memset函数常被我们用来初始化数组,然而有个坑可能会被我们踩到. 静态数组初始化 一般情形是这样的: #include <cstring> int main() { // 静态数组arr int arr[10]; // 将数组所有元素初始化为0 memset(arr,0,sizeof(arr)); // 遍历输出数组元素 for(int i=0;i<10;++i){ cout << arr[i] << endl; } return 0; } 这样做是正确的,通

Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)

package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date 2019/6/9 23:40 * @Version 1.0 */ public enum AlarmGrade { ATTENTION("attention", "提示"), WARNING("warning","警告"), SERIOUS(&