我有下面的代码。在函数xyz(int from, int to, int i)中。我正在打印i和i*2+1的值。但是我在i = 1和i*2+1 = -1上得到了意想不到的输出。函数xyz2()完全相同,只是取消了一个虚拟函数调用的注释,并且使用i = 0和i*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("\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;
}
}发布于 2014-01-04 12:47:36
printf("%d %d %d\n",array[i*2+1], (i*2)+1, i);第一个数据参数是long long。您需要更改格式字符串以匹配:
printf("%lld %d %d\n",array[i*2+1], (i*2)+1, i);当使用错误的转换规范时,您会出现奇怪的行为,原因是该行为没有定义:
C99§7.19.6.1/9如果任何参数不是对应的转换规范的正确类型,则该行为是未定义的。
这来自于fprintf规范,printf是根据该规范定义的。C99标准是C++11的规范。
发布于 2014-01-04 12:42:20
Xyz2(.)中的这一行:
printf("%d %d %d\n",array[i*2+1], (i*2)+1, i);与xyz(..)中的这一行不相同。
printf("%d %d\n", (i*2)+1, i);更改注释输出行将结果更改如下:
带行注释的
-4 1 0 1%0
行未注释的
141 1 0 1%0
我似乎没有得到任何奇怪的输出(我认为)使用XCode 5....but i AM获得有关打印字符串格式的警告:
printf("%d %d\n", (i*2)+1, i);应该是
printf("%lld %d\n", (i*2)+1, i);我相信,使用long long需要一种特殊的打印格式。这可能是问题所在..。
https://stackoverflow.com/questions/20921006
复制相似问题