V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jccg90
V2EX  ›  程序员

来,看几行 c++代码

  •  
  •   jccg90 · 2016-09-06 19:35:56 +08:00 · 5845 次点击
    这是一个创建于 2979 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问,下面这段代码有没有编译器警告,代码有没有问题,输出结果是多少? 求解答。。。

    #include<stdio.h>
    
    struct Info
    {
        bool a;
        double b;
    };
    
    void getInfoList( vector<Info> & infoList)
    {
        Info info;
        info.a = true;
        infoList.push_back(info);
    }
    
    int main()
    {
        vector<Info> infoList;
        getInfoList( infoList);
        for (vector<Info>::iterator It = infoList.begin(); It != infoList.end(); It++)
        {
            printf("%f",(*It).b);
        }
        return 0;
    }
    
    42 条回复    2016-09-08 10:31:59 +08:00
    loading
        1
    loading  
       2016-09-06 19:37:40 +08:00 via Android
    呵呵,真当这里的朋友不是人?
    dtfm
        2
    dtfm  
       2016-09-06 19:38:50 +08:00   ❤️ 1
    来,看几行 c++代码
    问,下面这段代码有没有编译器警告

    答,滚犊子
    Lonely
        3
    Lonely  
       2016-09-06 19:53:41 +08:00 via Android
    1 楼说得好
    klaus6d
        4
    klaus6d  
       2016-09-06 20:01:35 +08:00 via Android
    三楼说的好
    visionsmile
        5
    visionsmile  
       2016-09-06 20:02:11 +08:00
    四楼说的好。
    hellov22ex
        6
    hellov22ex  
       2016-09-06 20:02:46 +08:00
    特地打开了个试了下, return 的是 0 。
    imgalaxy
        7
    imgalaxy  
       2016-09-06 20:10:12 +08:00
    codepad.org
    ideone.com

    装个 Dev-C++能几分钟
    jccg90
        8
    jccg90  
    OP
       2016-09-06 20:13:14 +08:00
    @imgalaxy 哈,要是编译器直接能看出来对错,我还费劲发帖子干嘛。。。感觉像是使用了未初始化的内存,但是试了几个编译器都没有问题。。。所以才来问问
    bazingaterry
        9
    bazingaterry  
       2016-09-06 20:19:02 +08:00
    @jccg90 访问未初始化的内存并不会有警告,编译器根本不知道……
    jzy
        10
    jzy  
       2016-09-06 20:19:18 +08:00 via iPhone
    使用未初始化的变量难道语法上有错吗?为什么编译器要告诉你错?
    sgissb1
        11
    sgissb1  
       2016-09-06 20:41:07 +08:00
    LZ 不要胡说好吗?

    用了 stl 的 vector ,居然连 using namespace std;这个申明都不要吗?
    还有你只
    #include<stdio.h>
    是什么意思?


    你到底有没有在编译器里面跑过?要不你说说你在什么编译器里面跑过
    zhongkaixin
        12
    zhongkaixin  
       2016-09-06 20:46:40 +08:00
    现在某些 90 后,连最基本的礼貌都不懂了
    jmc891205
        13
    jmc891205  
       2016-09-06 21:06:56 +08:00
    b 的值是由 Info 的默认构造函数初始化的 并不是未初始化。
    至于它初始化用的是 0.0 还是用一个随机值 不同的编译器有不同的实现。
    KingHL
        14
    KingHL  
       2016-09-06 21:13:39 +08:00
    vector 中的 info 对象是在存在在 getInfoList 这个函数的调用栈上的,碰巧能打印出来是因为栈空间还没有被覆盖,不知道是不是我说的这样, c++好久没用了。
    KingHL
        15
    KingHL  
       2016-09-06 21:15:37 +08:00
    另外,楼主的这种提问方式,也是醉了,最起码你把程序写对了吧。
    yangff
        16
    yangff  
       2016-09-06 21:17:59 +08:00
    @jmc891205
    @KingHL
    ... push_back 是会复制(移动)的啊……
    chai2010
        17
    chai2010  
       2016-09-06 21:18:43 +08:00 via iPhone
    printf %d ,还是先把 C 语言弄清楚吧
    liuxu
        18
    liuxu  
       2016-09-06 21:19:05 +08:00
    @sgissb1 233,C++如果要用 c 的头文件,要用#include <cstdio>这样的格式
    jmc891205
        19
    jmc891205  
       2016-09-06 21:24:47 +08:00
    @yangff 是啊 copy 的时候调用默认拷贝构造函数 copy 之后的值还是等于 Info info 时默认构造函数用来初始化 b 的值
    yangff
        20
    yangff  
       2016-09-06 21:26:09 +08:00
    @jmc891205 我要回复 @KingHL 来着的……
    bp0
        21
    bp0  
       2016-09-06 21:48:44 +08:00
    好混搭的代码。
    qua
        22
    qua  
       2016-09-06 21:54:15 +08:00 via iPhone
    info.b 没初始化啊
    qua
        23
    qua  
       2016-09-06 21:55:32 +08:00 via iPhone
    这么简单的问题有什么好讨论的
    owt5008137
        24
    owt5008137  
       2016-09-06 22:41:34 +08:00 via Android
    有没有 warning 取决于你的编译选项,如果开全了 warning 的话会有 warning

    另外,一定会编译 error ,原因如 @sgissb1 所说。虽然可以默认包含某些头文件,但是我所知的任何一个环境都不会自动 #include<vector>

    最后问输出什么?这取决于你的编译器、编译选项、 runtime 库,还有硬件环境。所以你问会输出什么?鬼知道
    kingddc314
        25
    kingddc314  
       2016-09-06 23:17:30 +08:00
    局部变量的默认初始化具有不确定性,虽然这里打印是 0.0 ,但是后面再加上一个 int c; 成员后,打印的 b 却变成了随机值,应该是看编译器实现。所以不能依赖局部变量默认构造函数。全局变量的默认初始化则是零值了。

    另外实在没编译器也可以试试在线编译器,如 http://webcompiler.cloudapp.net/
    veelog
        26
    veelog  
       2016-09-06 23:20:49 +08:00 via Android
    不知道这几行代码有什么意思。。。。
    zby0826
        27
    zby0826  
       2016-09-06 23:54:13 +08:00
    看了这么多回复,也就 @jmc891205 正解……其他要么不会,要么挑刺,感觉 v 站 c++程序员太少。
    josephshen
        28
    josephshen  
       2016-09-07 00:38:41 +08:00 via iPhone
    有些人不光是不会啊而且是胡说啊,回国之后 v 站水平下降不少啊
    azh7138m
        29
    azh7138m  
       2016-09-07 00:54:51 +08:00
    ```

    /tmp/480407296/main.cpp:9:6: error: variable has incomplete type 'void'
    void getInfoList( vector<Info> & infoList)
    ^
    /tmp/480407296/main.cpp:9:19: error: use of undeclared identifier 'vector'
    void getInfoList( vector<Info> & infoList)
    ^
    /tmp/480407296/main.cpp:9:26: error: 'Info' does not refer to a value
    void getInfoList( vector<Info> & infoList)
    ^
    /tmp/480407296/main.cpp:3:8: note: declared here
    struct Info
    ^
    /tmp/480407296/main.cpp:9:34: error: use of undeclared identifier 'infoList'
    void getInfoList( vector<Info> & infoList)
    ^
    /tmp/480407296/main.cpp:9:43: error: expected ';' after top level declarator
    void getInfoList( vector<Info> & infoList)
    ^
    ;
    5 errors generated.

    ```

    https://glot.io/snippets/ei75xmvvui

    楼主你开心就好:)
    htfy96
        30
    htfy96  
       2016-09-07 07:19:11 +08:00 via Android
    其实 include stdio.h 就可以给你报编译错误…
    LigeLaige
        31
    LigeLaige  
       2016-09-07 08:24:41 +08:00
    难道不需要 #include <vector> 吗?
    KingHL
        32
    KingHL  
       2016-09-07 09:39:37 +08:00
    @yangff 恩,抱歉是我学艺不精说错了。
    lzhCoooder
        33
    lzhCoooder  
       2016-09-07 09:50:59 +08:00
    GCC 打开 -wall 试试
    jmc891205
        35
    jmc891205  
       2016-09-07 10:30:46 +08:00
    @zby0826 现在程序员都不从 C/C++开始入门啦 都是从 Python 、 JavaScript 开始学 不懂这些东西也正常
    araraloren
        36
    araraloren  
       2016-09-07 11:05:47 +08:00
    @jmc891205 楼主问问题的态度不怎么好吧。。
    至少该说说自己到底是怎么搞的,遇到了什么问题。。
    hitmanx
        37
    hitmanx  
       2016-09-07 13:38:53 +08:00
    你可能需要这个网站:
    http://coliru.stacked-crooked.com/

    代码往里一贴,点击 compile and run
    BlackKey
        38
    BlackKey  
       2016-09-07 16:15:43 +08:00
    编译器没有义务去警告未定义行为
    phttc
        39
    phttc  
       2016-09-07 17:02:36 +08:00
    C++ 输出难道不是 cout 么。。。到底要看 C 还是 C ++
    missdeer
        40
    missdeer  
       2016-09-07 17:16:22 +08:00
    作为 C++代码,第一行就没写好
    zwindl
        41
    zwindl  
       2016-09-07 19:44:36 +08:00
    来,吃点便便补补脑子。
    1. 不包含 <vector> 就使用 vector
    2. 没有使用 std ,就直接写 vector
    3. 你应该把编译环境说一下
    mozartgho
        42
    mozartgho  
       2016-09-08 10:31:59 +08:00
    我终于知道混 V 站的都是些什么人了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2833 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:33 · PVG 22:33 · LAX 07:33 · JFK 10:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.