我是一名计算机科学专业的大学生.昨天,我有一个关于使用C++的二进制搜索树的课程.我们由该班的实验室助理教授.
他们将树中的节点定义为这样的结构:
struct Data{
char name[15];
int age;
Data *left,*right;
};
Run Code Online (Sandbox Code Playgroud)
他们给了我们一个在BST内搜索的代码,如下所示:
// temp is current node, name is the value of the node to be searched for.
Data* search(Data *temp,char name[]) {
if(strcmp(temp->name,name)>0)
search(temp->left,name);
else if(strcmp(temp->name,name)<0)
search(temp->right,name);
else
return temp;
}
Run Code Online (Sandbox Code Playgroud)
我注意到代码是错误的.如果函数进入第一个或第二个if块,它将不执行任何return语句.
但是当实验室助理运行代码时,它运行得很好.
我想也许这种行为是特定于编译器的.但是当我在gcc上尝试该代码时,该函数也可以正常工作.(我们大学使用microsoft visual c ++编译器)
任何人都可以解释发生了什么?为什么这段代码有效?
PS:忽略其他错误,例如当节点为空时,找不到值等.
我正在阅读一篇有趣的文章"C和C++中未定义行为指南",第1部分,关于C和C++中未定义的行为.我经常在代码中执行以下操作:
int i = 10;
i = (++i) % 7;
Run Code Online (Sandbox Code Playgroud)
这会产生不确定的行为吗?在x86上?臂?也许这取决于编译器?
什么任务,功能,执行因编译器而异?我知道这段代码依赖于编译器 -
#include <stdio.h>
#define PRODUCT(x)(x*x)
int main()
{
int i=3,j,k;
j=PRODUCT(i++);
k=PRODUCT(++i);
printf("\n%d %d",j,k);
}
Run Code Online (Sandbox Code Playgroud)
下面给出了一些垃圾,而其他的则是固定值 -
#include <stdio.h>
int main()
{
int i=5,j=10;
printf("%d,%d");
}
Run Code Online (Sandbox Code Playgroud)
因此执行顺序因编译器而异.这些模棱两可的课程是否有资格参加考试?
我无法弄清楚我得到的输出的原因: -
int ar[5] = {1, 3, 5, 7, 9};
int *p = ar;
printf("%d\t%d\n", *p, *(p++));
Run Code Online (Sandbox Code Playgroud)
输出:3 1
但我希望:1 3表示p指向第1个元素,p ++指向第2个元素.
使用递归我试图找到树的高度,但输出似乎错误。任何错误?
#include <iostream>
struct node{
int data;
node* left, *right;
};
node* getNode(int item){
node* new_node = new node;
new_node->data = item;
new_node->left = new_node->right = nullptr;
return new_node;
}
node* insert(node* root, int item){
if(root == nullptr){
root = getNode(item);
}
else if(item < root->data){
root->left = insert(root->left, item);
}
else if(item > root->data){
root->right = insert(root->right, item);
}
return root;
}
int height(node* root){
if(root == nullptr){
return 0;
}
else{
return 1+std::max(height(root->left), height(root->right));
}
}
int main() …Run Code Online (Sandbox Code Playgroud) 如果我在 C++ 中使用嵌套的增量运算符,例如
int a = 1;
int b = (a++)++;
Run Code Online (Sandbox Code Playgroud)
它给出了一个编译时错误:
error: lvalue required as increment operand
但是,如果我写
int a = 1;
int b = ++(++a);
Run Code Online (Sandbox Code Playgroud)
的新值b变为 3。
这是什么原因?
我是C++的新手.我基本上是自学.我遇到了一个我正在练习的Hangman游戏项目.我的问题是随机字生成.
我知道例如,int n=rand()% 10意味着生成0到10范围内的随机数.
现在在游戏中有一个包含10个单词的10个单词的数组.我感到困惑的是,如果从0到10的数字是随机生成的,那么这将是从11个随机数中选择的.但是,该数组只有10个元素(0-9).
当随机发生器选择10时会发生什么?元素10不存在于数组中,对吗?
那么这段代码应该int n=rand()% 9不是吗?
此外,在游戏中选择所有单词之前,是否可以重复相同的单词?那显然不是理想的.如果可以的话,我该如何防止这种情况?
所以我有一个小程序
#include <iostream>
using namespace std;
void lol() {
cout << "How did we get here?"<<std::endl;
}
int main()
{
long a, b, z[10];
cin >> a >> b;
z[a] = b;
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处通过在线编译器运行它
该程序没有任何目的,但它有一个错误或功能 - 我不知道它是什么.所以,如果你写这样的东西,
main 13 2015你可能什么也得不到,但是如果你输入两个幻数13,4196608你就会得到一个错误.此外,程序执行功能void lol()并打印线How did we get here?.
我跑了nm ./main,发现我的函数void lol()的地址0000000000400900等于4196608(数字系统的基数是10).
这意味着程序由于某种原因"跳转"到该地址并执行该功能void lol().而且,如果我改变第一个数字,什么都不会发生.
main 10 4196608,main 11 4196608,main …
int main(void)
{
int n1 = 2, n2 = 5;
int *p = &n1, *q = &n2;
*p = *(q++);
printf("%d,%d", *p, *q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出= 5,5
为什么值为*q5它应该有一些垃圾值?
int main(void)
{
int n1 = 2, n2 = 5;
int *p = &n1, *q = &n2;
*p = *(++q);
printf("%d,%d", *p, *q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出= 2,2
这是怎么回事?任何人都可以解释优先规则如何在指针中工作?
我正在尝试创建一个getSortedRanks返回数组的函数.我从这个问题中复制了返回数组的格式.函数返回数组但是数组没有正确返回.
#include <stdlib.h>
#include <stdio.h>
#define familyMembers 4
int *getSortedRanks()
{
int rankedMembers[familyMembers] = {3,4,2,1};
return rankedMembers;
}
int main()
{
int *sortedRanks = getSortedRanks();
//print the returned array
for(int i = 0; i < familyMembers; i ++)
{
cout << "ranked member is " << sortedRanks[i] << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,输出是:
ranked member is 3
ranked member is 0
ranked member is 0
ranked member is 2686744
Run Code Online (Sandbox Code Playgroud)
数组的第一个元素sortedRanks总是正确的,但其他元素则不正确.如何更正返回数组的方式?