最近碰到个很奇怪的问题,在写 for 循环的时候 vscode 会自动把i
的类型设为size_t
,我看这也没改,一直用着也没事,但是昨天在写这样几句(大致差不多就这样写的)出了问题:
const boarder = 20;
for (size_t i = boarder; i < width;i++){
/**code**/
}
发现一直有错误,一直不结束循环,百思不得其解,打印 i 发现 i 的初值是个很长的负数,改成int i = boarder
就没问题了.今天想到这个又回头看了一下,不能确定是不是因为size_t
.
1
jmc891205 2019-05-21 20:03:35 +08:00 via iPhone
为啥不声明 boarder 的类型?编译器不报错?
|
2
codechaser OP @jmc891205 ...我打错了,漏了一个`int`
|
3
maggch 2019-05-21 20:18:33 +08:00 via Android
size_t 无符号
|
4
exonuclease 2019-05-21 20:24:54 +08:00 via iPhone
size_t 是无符号的
|
5
lrh3321 2019-05-21 21:00:10 +08:00 via Android
size_t 无符号,--的 for 循环会永远>=0
|
6
secondwtq 2019-05-21 21:08:14 +08:00 1
|
7
forestyuan 2019-05-21 22:19:53 +08:00
无符号数和有符号数比较大小,编译器会报警告。如果没报,可能是你的开发环境没有设置好。
|
8
zwh2698 2019-05-21 22:28:32 +08:00 via Android
Width 类型?
|
9
liuzhedash 2019-05-22 10:40:30 +08:00
有点意思,但是没能复现
|
10
CRVV 2019-05-22 10:50:43 +08:00
1. size_t 当然能用,用对了就是安全的,用错了可能不安全
2. 发代码要用复制粘贴功能,不要手动输入 3. 发代码要把代码粘全,你发的代码编译不过 |
11
ryd994 2019-05-22 11:20:48 +08:00 via Android
一个单线程的用户程序,讲什么线程安全?
|
12
codechaser OP @CRVV 嗯嗯,不好意思。我以为只需要贴问题代码就可以了,下次改。
|
13
codechaser OP @zwh2698 width 是 opencv 图片的 width 属性
|
14
zwh2698 2019-05-22 13:32:17 +08:00 via Android
Width 的类型是 int 吧,你这一句有两次转型,i 初始化的时候类型要做提升,<的时候 width 要做提升,width 是负数的时候,循环就是会很多次。你可能会说图形宽怎么有负值。正负代表的是方向。绝对值就是宽。比如位图如果是倒存的,高就是负值。你可以找个位图文件看看。
|
15
dosmlp 2019-05-30 23:19:02 +08:00
size_t 虽然有不同实现,但极大概率是无符号的,i++换成++i 可以避免某些情况下的 bug
另外信息量少也没办法复现这个问题,但肯定是你代码问题,是不是文件编码有问题? |