首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++编译器的异常行为

C++编译器的异常行为
EN

Stack Overflow用户
提问于 2014-01-04 12:31:19
回答 2查看 122关注 0票数 2

我有下面的代码。在函数xyz(int from, int to, int i)中。我正在打印ii*2+1的值。但是我在i = 1i*2+1 = -1上得到了意想不到的输出。函数xyz2()完全相同,只是取消了一个虚拟函数调用的注释,并且使用i = 0i*2+1 = 1获得了预期的输出。我已经解释过了,请看输出量。另外,我要提到的是,我在本地机器上得到了相同的输出。

为什么会发生这种情况?

代码语言:javascript
复制
    #include <stdio.h>
    #include <stdlib.h>

    long long arr[2];
    long long xyz(int from, int to, int i);
    long long array[200000];
    long long xyz2(int from, int to, int i);

    long long foo(){return 141;}

    int main(){
        int n=2;
        arr[0] = -4;
        arr[1] = 5;
        xyz(0, 1, 0);
        printf("\n\n");
        xyz2(0, 1, 0);
        return 0;
    }

    long long xyz2(int from, int to, int i){
        if(from==to){
            return arr[to];
        }else{
            int mid = (from+to)/2;
            array[i*2+1] = xyz2(from, mid, i*2+1);
            array[i*2+1] = foo();
            printf("%d %d\n", (i*2)+1, i);
            return 100000;
        }
    }

    long long xyz(int from, int to, int i){
        if(from==to){
            return arr[to];
        }else{
            int mid = (from+to)/2;
            array[i*2+1] = xyz(from, mid, i*2+1);
            //array[i*2+1] = foo();   // The above function xyz2 gives the 
                                  //correct results on uncommenting this line
            printf("%d %d %d\n",array[i*2+1], (i*2)+1, i);
            return 100000;
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-04 12:47:36

代码语言:javascript
复制
printf("%d %d %d\n",array[i*2+1], (i*2)+1, i);

第一个数据参数是long long。您需要更改格式字符串以匹配:

代码语言:javascript
复制
printf("%lld %d %d\n",array[i*2+1], (i*2)+1, i);

当使用错误的转换规范时,您会出现奇怪的行为,原因是该行为没有定义:

C99§7.19.6.1/9如果任何参数不是对应的转换规范的正确类型,则该行为是未定义的。

这来自于fprintf规范,printf是根据该规范定义的。C99标准是C++11的规范。

票数 6
EN

Stack Overflow用户

发布于 2014-01-04 12:42:20

Xyz2(.)中的这一行:

代码语言:javascript
复制
  printf("%d %d %d\n",array[i*2+1], (i*2)+1, i);

与xyz(..)中的这一行不相同。

代码语言:javascript
复制
  printf("%d %d\n", (i*2)+1, i);

更改注释输出行将结果更改如下:

带行注释的

-4 1 0 1%0

行未注释的

141 1 0 1%0

我似乎没有得到任何奇怪的输出(我认为)使用XCode 5....but i AM获得有关打印字符串格式的警告:

代码语言:javascript
复制
printf("%d %d\n", (i*2)+1, i);

应该是

代码语言:javascript
复制
printf("%lld %d\n", (i*2)+1, i);

我相信,使用long long需要一种特殊的打印格式。这可能是问题所在..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20921006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档