swap(int&, int&) 函数不起作用,当交换不使用临时变量时?
swap(int&, int&) function isn't working, when swapped without using temp variable?
当我发现这个时,我正在编写quickSort()
函数来对int[]
进行排序 - 好吧,我不知道我应该怎么称呼它 -undefined behaviour
或error
或我现在无法理解的某种东西。
快速排序程序:
// quick sort
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
// constant
enum {MAX = 10};
// class
class A
{
private:
int arr[MAX];
public:
A() // constructor
{
srand(time(0));
for(int i = 0; i < MAX; i++)
arr[i] = rand() % 100;
}
// accessing array
int get(int i)
{
return arr[i];
}
// quick sort
int Partition(int left, int right);
void quickSort(int left, int right);
void Swap(int&, int&);
};
// member function definition
int A::Partition(int left, int right)
{
int pivot = arr[right], i = left - 1;
for(int j = left; j <= right-1; j++)
{
if(arr[j] < pivot)
{
i++;
Swap(arr[i], arr[j]);
}
}
Swap(arr[i+1], arr[right]);
return i+1;
}
void A::quickSort(int left, int right)
{
if(left < right)
{
int pi = Partition(left, right);
quickSort(left, pi-1);
quickSort(pi+1, right);
}
}
void A::Swap(int& a, int& b)
{
a = a+b;
b = a-b;
a = a-b;
}
// driver
int main(void)
{
A obj1;
//-------Array initialized--------
cout << "Before sorting:" << endl;
for(int i = 0; i < MAX; i++)
cout << setw(4) << obj1.get(i);
//--------Sorting Array-----------
obj1.quickSort(0, MAX-1);
//--------Sorted Array------------
cout << "nAfter sorting:" << endl;
for(int i = 0; i < MAX; i++)
cout << setw(4) << obj1.get(i);
return 0;
}
问题出在swap()
函数内部。当我使用int temp
变量交换值时,值被交换,数组按升序排序。
但是当我在不使用临时int
变量的情况下交换值时,我在排序数组中得到了0
s。如下图所示:
输出:
Before sorting:
89 43 18 98 23 88 52 18 1 25
After sorting:
1 18 0 0 25 43 0 88 89 98
当我调试swap()
时,参数a
和b
引用了相同的地址this
。
您使用错误的格式来获取学生姓名。 将scanf("%d", &name);
更改为scanf("%s", name);
此外,int marks[4]
创建 4 个元素。但是在 for 循环中,您正在阅读 5 个标记。当i=4
marks[i]
是第 5 个元素时。所以你必须把int marks[4]
改成int marks[5]
我认为最好将数组大小定义为常量值。
#define MARKS_COUNT 5
int main()
{
// ...
int total = 0, i, marks[MARKS_COUNT];
// ...
for(i=0; i<MARKS_COUNT; i++){
scanf("%d", &marks[i]);
}
for(i=0; i<MARKS_COUNT; i++){
total += marks[i];
}
avr=(float)total/MARKS_COUNT;
// ...
}
另请阅读此处的格式字符串 http://www.cplusplus.com/reference/cstdio/scanf/
为什么会这样?
数组marks[4]
太小,分配给marks[4]
无效。在scanf("%d", &marks[i]);
i == 4
时,您将值分配给marks[4]
.该标准说它是未定义的行为访问marks[4]
以任何方式,所以从标准的角度来看,程序具有未定义的行为,任何事情都可能发生。
我想很可能您的编译器已经放置了局部变量,以便&marks[4] == &name[0]
- 数组末尾marks
元素 1 的地址与name
数组的地址相同。
很可能在您的系统上sizeof(int) >= 2
.当scanf
从输入中读取90
时,它会将sizeof(int)
字节存储到您为其提供的指针中。假设&marks[4] == &name[0]
,执行时的scanf("%d", &marks[4])
变得scanf("%d", name);
。
假设您的环境CHAR_BIT = 8
正常,并且您的环境是小端序,scanf
实际上将一个字节90
存储到指针的第一个字节中并清除其他字节。因此,sscanf("90", "%d", &name[0])
将"半"等于将sizeof(int)
字节写入name
- 一个值为 90 的字节和sizeof(int) - 1
个零的字节,就像memcpy(&name[0], (char[sizeof(int)]){90,0}, sizeof(int))
一样。
C 中的字符串以零结尾,因为整数 90 是 ascii 中的字母Z
,零是字符串终止字符,所以稍后执行以下操作时:
printf("%s", name);
name
实际上指向一个以空结尾的字符串,其中第一个字节'Z'
,第二个字节是零终止字符,因此它只打印Z
。
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- 将子字符串字符从字符串值转换为 int,然后将其分配给 int 变量
- 如何在传递给 C/C++ 宏之前解析 int 变量?
- 有什么方法可以使用 int 变量来完成组件名称吗?
- 如何将整数值解析为逗号分隔字符串中的单独 int 变量?
- 为什么我的 std::atomic<int> 变量不是线程安全的?
- std::out_of_range 在静态 int 变量上
- 如何转换 int 变量并附加到常量 wchar_t*
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 如何将字符串分配给INT变量
- QT连接:使用lambda表达式重置通过了int变量(怪异)
- 如何将私有整数从A类传递到C 类B类的另一个INT变量
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 如何使用主函数和来自 getData 函数的用户输入将值初始化为 int 变量 im
- lambda捕获的const int变量的值类别
- 当用户输入int变量的字符串时,输出
- 将字符放入 int 变量中以停止循环
- 根据C++标准,int 变量是对象吗?
- C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?