首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在for -循环初始化中声明uint8,因为在for循环初始化中不允许var

如何在for -循环初始化中声明uint8,因为在for循环初始化中不允许var
EN

Stack Overflow用户
提问于 2018-10-30 05:45:22
回答 1查看 3.1K关注 0票数 3

我编写以下代码来计算人口数如下:

代码语言:javascript
复制
package main

import (
    "fmt"
)

func main() {
    var pc [256]byte

    for i := range pc {
        pc[i] = pc[i/2] + byte(i&1)
    }

    var x uint64 = 65535
    var population uint8

    for i := 0; i < 8; i++ {
        population  = population + pc[byte(x>>(i*8))]
    }

    fmt.Printf("Population Count: %d", population)
}

在编译时,我得到以下错误:

prog.go:19:39:无效操作:x >> (i * 8) (移位计数类型int,必须是无符号整数)

问题在于变量i是在初始化for循环时声明的。i的速记初始化使得它成为int类型,在signed int32类型的内部。这就是为什么下面一行:

代码语言:javascript
复制
population  = population + pc[byte(x>>(i*8))]

是造成问题的原因。因为shift运算符>>只期望无符号整数,但是表达式i*8会将结果转化为内部signed int32int

由于var不能用于for初始化。

代码语言:javascript
复制
for var i uint8 = 0; i < 8; i++ { ... }

语法错误:初始化器不允许var声明

我可以在i之外声明变量for loop,但是我发现它没有干净可读性。

实现同样目标的清洁方式应该是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-30 05:49:54

Go程序设计语言规范 变量声明 ..。每个变量都被赋予赋值中相应初始化值的类型。

i := uint(0)。例如,

代码语言:javascript
复制
package main

import (
    "fmt"
)

func main() {
    var pc [256]byte

    for i := range pc {
        pc[i] = pc[i/2] + byte(i&1)
    }

    var x uint64 = 65535
    var population uint8

    for i := uint(0); i < 8; i++ {
        population = population + pc[byte(x>>(i*8))]
    }

    fmt.Printf("Population Count: %d", population)
}

操场:dOq

输出:

代码语言:javascript
复制
Population Count: 16
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53058108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档