【发布时间】:2015-08-16 19:26:48
【问题描述】:
我这里有一些代码可以反转字符数组:
#include <iostream>
#include <string>
using namespace std;
char s[50];
void reverseChar(char * s)
{
for (int i=0; i<strlen(s)/2; ++i)
{
char temp = s[i];
s[i] = s[strlen(s)-i-1];
s[strlen(s)-i-1] = temp;
}
}
int main() {
cout << "Hello, this program reverses words." << endl << endl;
cout << "Enter in a word, no spaces please:" << endl;
cin.getline(s, 50);
cout << "This is the word, it has now been reversed:" << endl;
reverseChar(s);
cout << s;
return 0;
}
在 for 循环中,有人可以解释硬件级别发生了什么。我知道'temp'被分配给一个字节,它被分配给s[i]的值。
内存是否分配给所有东西?
等号、s[i] 等?
在字节被赋值给s[i]中的值之后,s[i]被赋值给数组s中的某个其他值。然后将这个其他值分配给 temp。
我无法理解所有这些字节的去向,以及它们是如何被 C++ 操纵的。
我明白了:
s[i] = s[strlen(s)-i-1];
占位符值正在交换?
在这一行:
s[strlen(s)-i-1] = temp;
“复制”值被发送到“临时”。但是之后这个 temp 值会发生什么,一旦 for 循环重复,它会变成新的“temp”吗?
【问题讨论】:
-
您需要学习计算机体系结构以及编译器如何工作的课程。 :)
-
那么你为什么想知道所有这些底层细节呢?
-
@user3528438 你在讽刺吗? OP 并没有询问“低级细节”,尽管他认为他是。他实际上表现出明显缺乏对 C++ 语法如何工作的理解,正如 Lightness 指出的那样,C++ 代码如何被翻译成机器代码(对有效使用任何编译语言的基本理解是必不可少的)。没有什么是更多研究无法解决的。
-
一些旁注: 1. 在这种情况下,将变量
s声明为全局是一个坏主意(通常情况下,除非你真的需要它)。无论如何,如果它是全局的,那么您就不需要将它传递给函数,而且,使用同名的局部变量会使您的代码更不可读。 -
(续:) 在函数范围内,编译器会优先选择局部变量而不是全局变量,并且由于您使用全局变量调用函数,因此即使编译器选择了全局变量,然而,整个事情似乎毫无意义。只需在函数
main中声明变量,并在需要时将其传递给其他函数。 2. 您在for循环内调用了strlen(s)3 次。在循环之前调用一次,并使用返回值。
标签: c++ arrays for-loop memory char