iota在常量声明语句中,iota往往用于声明连续的整型常量。iota的取值与其出现的位置强相关。
关于iota的取值规则,有些书上或博客中给出了类似下面的描述
1.iota在const关键字出现时被重置为0
2.const声明块中每新增一行,iota值自增1
实际上从编译器的角度看iota,其取值规则只有一条:
iota代表了const声明块的行索引(下标从0开始)。
这样理解更贴近编译器的实现逻辑,也更准确。除此之外,const声明还有一个特点,即如果为常量指定了一个表达式,但后续的常量没有表达式,则继承上面的表达式。
接下来,我们根据这个规则来分析一个复杂的常量声明:
const(
bit0,mask0= 1<< iota,1<<iota - 1 //const声明第0行,即iota==0
bit1, maskl // const声明第1行,即iota==1,表达式继承上面的语句
_ , _ //const声明第2行,即iota==2
bit3, mask3 //const声明第3行,即iota==3
)
0.第0行的表达式展开即bit0,mask0 = 1 << 0 , 1<< 0 - 1,所以bit0 == 1,mask0 == 0。
1.第1行没有指定表达式继承第一行,即bit1,mask1 = 1 << 1, 1 << 1 - 1,所以bit1==2,
mask1 == 0 ;
2.第二行没有定义常量
3.第三行没有指定表达式继承第一行,即bit3 , mask3 = 1 << 3, 1 << 3 - 1,所以bit3 == 8,
mask3 == 7。
iota的本质,它仅代表常量声明的索引,所以它会表现出以下特征:
单个const声明块中从0开始取值;
单个const声明块中,每增加一行声明,iota 的取值增1,即便声明中没有使用iota也是如此;
单行声明语句中,即便出现多个iota,iota的取值也保持不变。