[问题] auto用法一问

楼主: WangDaMing (王大明)   2021-11-02 23:11:28
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
问题(Question):
我本来以为auto可以这样用,不过这种情况似乎不太适用??
我想要全程使用auto帮我推导,不过vector的size是unsigned我直接这样用有问题
以我的范例难道我还是只能自己指定j的型态嘛(int)
有比较正确auto的方式嘛??感觉都会推导错误??
预期的正确结果(Expected Output):
test 1
test 0
错误结果(Wrong Output):
无穷循环
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> ans = {1,2,3};
auto n = ans.size();
for(auto j = n - 2;j >= 0;
作者: mikemike1021 (mike)   2021-11-02 23:16:00
因为 auto 会导致他是 unsigned,0-1不会是负数,导致你的循环条件永远成立,所以会是无穷循环或者你循环条件也可以改成 j < j + 1
作者: aiwhat   2021-11-03 00:38:00
unsigned 和 signed 变量比较时会转型成 unsignedvector::size 回传 unsigned → j = n - 2 也是 unsigned
作者: peter98 (新兵)   2021-11-03 03:04:00
Size() returns unsigned
作者: chchwy (mat)   2021-11-03 09:54:00
自动推导的j是无号数阿 无号数怎么可能会小于零呢?所以你的for loop条件永远都成立 无法离开回圈
作者: b0920075 (Void)   2021-11-03 12:59:00
推导错误x 你写错o
作者: KevinR (Kevin)   2021-11-03 13:57:00
推导错误X 你用错○
作者: a27417332 (等号卡比)   2021-11-03 15:17:00
借串问,好奇对于这种unsigned然后往下数的状况通常for里面会怎么写?
作者: nh60211as   2021-11-03 15:43:00
不要往下数或是用reverse iterator
作者: sarafciel (Cattuz)   2021-11-03 19:45:00
1.你如果不知道型态 最好不要用auto2. 你如果不知道发生什么事 最好也不要讲推导错误
楼主: WangDaMing (王大明)   2021-11-03 23:30:00
感谢以上各位大大~其实我是想问这有没有较好的写法还是就真的不知道size的型态不要随便用auto...Orz
作者: ketrobo (猫萝卜)   2021-11-04 00:01:00
不知道就学一下const iterator,粉好用
作者: tomsawyer (安安)   2021-11-04 01:39:00
我的话 觉得auto拿来接iterator可以少打字 lol
作者: NciscalA   2021-11-04 09:28:00
for_each + reverse iterator
作者: a27417332 (等号卡比)   2021-11-04 19:46:00
万一是需要index呢?该不会用rev iter+额外index吧?
作者: nh60211as   2021-11-04 19:48:00
可以用std::distance
作者: chchwy (mat)   2021-11-05 07:30:00
真的要往下数...就用int啊,不要auto推导就好了
作者: firejox (Tangent)   2021-11-05 10:35:00
作者: steve1012 (steve)   2021-11-05 13:12:00
不要滥用auto 就解决了type information很好用 除非真的很有帮助 (e.g. itererator type name 很长) 最好都直接写type name
作者: Dracarys (MayShowGunMore)   2021-11-07 23:45:00
它照你打的执行没有错啊 unsigned没问题 推导没有错
作者: alex780312 (Alex)   2021-11-09 07:37:00
同一行就知道型态时可以auto一下,例如auto ptr =make_unique<MyClass>(…);我是建议不要自己把size_t和unsigned 互换,是长度就维持size_t。甚至要用using MyNumber = int;的方式确保不会让所有函数都吃最基本形态而看不出是啥东西。早起的NULL 变成现在nullptr 也是一个可以学习的例子形态名字太长可以用using改善,auto是避免冗余描述,例如使用template 时的例子
作者: Dracarys (MayShowGunMore)   2020-01-11 08:56:00
最近看到一本C的书是这样写,一楼也有提到,>=改成<=:https://godbolt.org/z/eqec86jTE

Links booklink

Contact Us: admin [ a t ] ucptt.com