作者WangDaMing (王大明)
看板C_and_CPP
标题[问题] auto用法一问
时间Tue Nov 2 23:11:28 2021
开发平台(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;--j)//改成int j = n -2就ok
{
printf("test %ld\n",j);
}
}
※ 编辑: WangDaMing (36.230.5.115 台湾), 11/02/2021 23:12:51
1F:→ mikemike1021: 因为 auto 会导致他是 unsigned,0-1不会是负数,导 11/02 23:16
2F:→ mikemike1021: 致你的回圈条件永远成立,所以会是无穷回圈 11/02 23:16
3F:→ mikemike1021: 或者你回圈条件也可以改成 j < j + 1 11/02 23:20
4F:→ aiwhat: unsigned 和 signed 变数比较时会转型成 unsigned 11/03 00:38
5F:→ aiwhat: vector::size 回传 unsigned → j = n - 2 也是 unsigned 11/03 00:39
6F:→ peter98: Size() returns unsigned 11/03 03:04
7F:推 chchwy: 自动推导的j是无号数阿 无号数怎麽可能会小於零呢? 11/03 09:54
8F:→ chchwy: 所以你的for loop条件永远都成立 无法离开回圈 11/03 09:55
9F:推 b0920075: 推导错误x 你写错o 11/03 12:59
10F:→ KevinR: 推导错误X 你用错○ 11/03 13:57
11F:→ a27417332: 借串问,好奇对於这种unsigned然後往下数的状况 11/03 15:17
12F:→ a27417332: 通常for里面会怎麽写? 11/03 15:17
13F:→ nh60211as: 不要往下数或是用reverse iterator 11/03 15:43
14F:推 sarafciel: 1.你如果不知道型态 最好不要用auto 11/03 19:45
15F:→ sarafciel: 2. 你如果不知道发生什麽事 最好也不要讲推导错误 11/03 19:46
16F:→ WangDaMing: 感谢以上各位大大~其实我是想问这有没有较好的写法 11/03 23:30
17F:→ WangDaMing: 还是就真的不知道size的型态不要随便用auto...Orz 11/03 23:31
18F:→ ketrobo: 不知道就学一下const iterator,粉好用 11/04 00:01
19F:→ tomsawyer: 我的话 觉得auto拿来接iterator可以少打字 lol 11/04 01:39
20F:推 NciscalA: for_each + reverse iterator 11/04 09:28
21F:→ a27417332: 万一是需要index呢?该不会用rev iter+额外index吧? 11/04 19:46
22F:→ nh60211as: 可以用std::distance 11/04 19:48
23F:推 chchwy: 真的要往下数...就用int啊,不要auto推导就好了 11/05 07:30
25F:推 steve1012: 不要滥用auto 就解决了 11/05 13:12
26F:→ steve1012: type information很好用 除非真的很有帮助 (e.g. iter 11/05 13:12
27F:→ steve1012: erator type name 很长) 最好都直接写type name 11/05 13:12
28F:推 Dracarys: 它照你打的执行没有错啊 unsigned没问题 推导没有错 11/07 23:45
29F:推 alex780312: 同一行就知道型态时可以auto一下,例如auto ptr =ma 11/09 07:37
30F:→ alex780312: ke_unique<MyClass>(…); 11/09 07:37
31F:→ alex780312: 我是建议不要自己把size_t和unsigned 互换,是长度就 11/09 07:46
32F:→ alex780312: 维持size_t。甚至要用using MyNumber = int;的方式确 11/09 07:46
33F:→ alex780312: 保不会让所有函数都吃最基本形态而看不出是啥东西。 11/09 07:46
34F:→ alex780312: 早起的NULL 变成现在nullptr 也是一个可以学习的例子 11/09 07:46
35F:推 alex780312: 形态名字太长可以用using改善,auto是避免冗余描述, 11/09 07:55
36F:→ alex780312: 例如使用template 时的例子 11/09 07:55
37F:推 Dracarys: 最近看到一本C的书是这样写,一楼也有提到,>=改成<=: 01/11 08:56