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

Very anomalous behaviours by C++ compiler

本文关键字:异常 C++ 非常 编译器      更新时间:2023-10-16

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

为什么会这样?

    #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("nn");
        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 %dn", (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 %dn",array[i*2+1], (i*2)+1, i);
            return 100000;
        }
    }
printf("%d %d %dn",array[i*2+1], (i*2)+1, i);

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

printf("%lld %d %dn",array[i*2+1], (i*2)+1, i);

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

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

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

xyz2(..) 中的这一行:

  printf("%d %d %dn",array[i*2+1], (i*2)+1, i);

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

  printf("%d %dn", (i*2)+1, i);
更改

注释掉的行更改了结果,如下所示:

带行注释

-4 1 0

1 0

行未注释

141 1 0

1 0

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

printf("%d %dn", (i*2)+1, i);

应该是

printf("%lld %dn", (i*2)+1, i);

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