编译器C++非常异常的行为
Very anomalous behaviours by C++ compiler
我有以下代码。在函数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("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);
我相信,使用长长需要特殊的打印格式。 这可能是问题所在...
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常