相关疑难解决方法(0)

为什么这个循环产生"警告:迭代3u调用未定义的行为"并输出超过4行?

编译:

#include <iostream>

int main()
{
    for (int i = 0; i < 4; ++i)
        std::cout << i*1000000000 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

gcc产生以下警告:

warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]
   std::cout << i*1000000000 << std::endl;
                  ^
Run Code Online (Sandbox Code Playgroud)

我知道有一个有符号的整数溢出.

我不能得到的是为什么i价值被溢出操作打破了?

我已经阅读了为什么x86上的整数溢出与GCC导致无限循环的答案,但我仍然不清楚为什么会发生这种情况 - 我认为"未定义"意味着"任何事情都可能发生",但这种特定行为的根本原因是什么?

在线:http://ideone.com/dMrRKR

编译: gcc (4.8)

c++ gcc undefined-behavior

160
推荐指数
5
解决办法
6万
查看次数

为什么在没有返回值的情况下流出非void函数的末尾不会产生编译器错误?

自从我多年前意识到这一点,默认情况下这不会产生错误(至少在GCC中),我一直想知道为什么?

我知道您可以发出编译器标志来产生警告,但是它不应该总是出错吗?为什么非void函数没有返回值才有效?

评论中要求的示例:

#include <stdio.h>
int stringSize()
{
}

int main()
{
    char cstring[5];
    printf( "the last char is: %c\n", cstring[stringSize()-1] ); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

...编译.

c c++ gcc g++

157
推荐指数
5
解决办法
4万
查看次数

为什么这个C++片段编译(非void函数不返回值)

今天早上我在我的一个图书馆找到了这个:

static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out)
{
    tvec3::Min(a,b,out);
    out.w = min(a.w,b.w);
}
Run Code Online (Sandbox Code Playgroud)

我期望编译器错误,因为此方法不返回任何内容,并且返回类型不返回void.

想到的唯一两件事是

  • 在调用此方法的唯一位置,不使用或存储返回值.(此方法应该是void- tvec4返回类型是复制和粘贴错误)

  • tvec4正在创建一个默认构造,这看起来有点不同,哦,C++中的其他所有东西.

我还没有找到解决这个问题的C++规范部分.参考文献(ha)表示赞赏.

更新

某些情况下,这会在VS2012中生成错误.我没有缩小具体细节,但它仍然很有趣.

c++ methods c++11 visual-studio-2012

128
推荐指数
5
解决办法
1万
查看次数

标签 统计

c++ ×3

gcc ×2

c ×1

c++11 ×1

g++ ×1

methods ×1

undefined-behavior ×1

visual-studio-2012 ×1