我的功能有这个问题.
在main函数中我有这个result(param, param)函数,它有2个函数作为参数.
result(name(), score());
Run Code Online (Sandbox Code Playgroud)
但是,当代码执行时,score()函数首先执行而不是函数执行name().为什么会这样呢?
(还有一个问题是由score()函数首先执行而不是函数执行的name()是我得到了\n读取并且name()函数被完全跳过.但是我知道如何解决这个问题我只需要知道为什么不name()执行该函数首先.)
我在这里找到了这个:http://en.cppreference.com/w/cpp/language/eval_order.
任何C++运算符的操作数的评估顺序,包括函数调用表达式中函数参数的评估顺序,以及任何表达式中子表达式的评估顺序都是未指定的(除非另有说明).编译器将以任何顺序对它们进行评估,并且可以在再次评估相同表达式时选择另一个顺序.
在C++中没有从左到右或从右到左评估的概念,不要将操作符的从左到右和从右到左的关联性混淆:表达式
f1() + f2() + f3()被解析为(f1() + f2()) + f3()左边的运算符+的右对称关系,但是对f3的函数调用可以在运行时的第一个,最后一个或之间f1()或之间进行评估f2().**
但我的程序总是score()首先执行该功能.在它上面说它是随机的所以我至少应该name()首先执行函数有时是正确的吗?
完整代码可供参考.
#include <iostream>
#include <string>
using namespace std;
string name()
{
string fname;
cout << "Please type your full name: ";
getline(cin, fname);
return fname;
}
int score()
{
int points; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将两个数组附加在一起.{0, 1, 2}附加到第二个数组时的第一个数组{3, 4, 5}应该产生{0, 1, 2, 3, 4, 5}.在我继续之前,让我告诉你我的所作所为:
#include <iostream>
int main() {
int i = 0;
int arr1[] = {3, 4, 5}, arr2[] = {0, 1, 2};
while (i < 3) {
arr2[3 + i] = arr1[i];
i++;
}
std::cout << std::endl;
for (int i = 0; i < 6; i++) std::cout << arr2[i] << std::endl; // print
}
Run Code Online (Sandbox Code Playgroud)
我认为我实施它的方式是正确的.但我发现当我打印出新数组(arr2)的内容时,这就是我得到的:
0
1
2
-1219315227
-1218166796
134514640
Run Code Online (Sandbox Code Playgroud)
0, 1, 2 …
pDosHeader 加载到 ECXpDosHeader->f_lfanew加载到EAX(值,而不是指针)
pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew);
Run Code Online (Sandbox Code Playgroud)上面的代码ades ECX + EAX并得到了我想要的结果......但是如果我决定在x64上编译一些东西,那么显然是把它指向DWORD的坏习惯了
pNtHeaders = (PIMAGE_NT_HEADERS)( (PDWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew );pNtHeaders = (PIMAGE_NT_HEADERS)( (PDWORD)pDosHeader + pDosHeader->e_lfanew );上面的代码添加ECX + EAX * 4并得到了我不想要的结果.对于1和2.
我的问题是为什么?为什么C++会像这样编译我的代码?当我将dos标头转换为指针时,为什么它将e_lfanew乘以4?
它是否假设我想让我的指针指向下一个元素x次?因此将它乘以4以便我可以到e_lfanew(th)元素而不是添加e_lfanew?它可能会.
那我该怎么办?以C++方式编译此代码的正确方法是什么,以便在不使用坏习惯的情况下获得所需的结果?
我不想要的e_lfanewth元素pDosHeader.我只是希望它添加e_lfanew到pDosHeader.
我编写了以下代码,我无法理解为什么Enemy()构造函数被调用两次.另外作为一个侧面问题,我想问一下是否通过使它们成为虚拟来覆盖成员函数然后再次编写它们的定义是在类之间重写函数的"正确"方法.
#include <iostream>
using namespace std;
class Enemy {
public: Enemy();
virtual void attack();
};
Enemy::Enemy() {
cout << "\nEnemy created";
}
void Enemy::attack() {
cout << "\nattack inflicts 10 damage";
}
class Boss: public Enemy {
public: Boss();
virtual void attack();
};
Boss::Boss() {
cout << "\nYou encounter a boss";
}
void Boss::attack() {
cout << "\nattack inflicts 30 damage";
}
int main() {
Enemy enemy1;
enemy1.attack();
Boss boss1;
boss1.attack();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个代码来输入几个字符串并比较字符串的长度,然后将较短的字符串打印到控制台输出.但是代码没有按预期工作,并且在给出任何输入集时,我得到的输出是一个空白屏幕(没有显示字符串).谁能告诉我我做错了什么?
该input数组具有由用户提供的字符串,并且这些字符串也存在于其中a,因此string[i] == a[j]对于特定值,line()将执行为true a.
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
long n, m;
cin >> n >> m;
char a[m][10], b[m][10]; // will print the shorter out of these two
for (long i = 0; i < m; i++) cin >> a[i] >> b[i];
char input[n][10];
for (long i = 0; i < n; i++) cin >> input[i];
for (long i = 0; i < n; i++)
{ …Run Code Online (Sandbox Code Playgroud) 我的while循环不会在我设置它的条件下运行.
该计划的目的是使用存款金额,利率和目标金额确定存款金额到期的年数.
程序刚刚输入目标金额后停止,除非我将while语句从<=更改为> =在这种情况下它运行循环但返回在第100轮或1000等设置的年数...
#include <iostream>
#include <iomanip>
#include <string>
#include <math.h>
using namespace std;
int main()
{
//declare the variables
double rate,
balance = 0;
int deposit,
target,
years = 0;
cout << "****Lets make you some money!****" << endl << endl;
//input from the user
cout << "What is your deposit amount?: " << endl;
cin >> deposit;
cout << "What is your interest rate?: " << endl;
cin >> rate;
cout << "What is you target savings …Run Code Online (Sandbox Code Playgroud) 我有奇怪的事情,据我的经验,我可以在C++中调用bug.当我打电话给这个节目时:
#include <iostream>
using namespace std;
class foo {
public:
int a;
foo(int a = 0) : a(a) {}
} a1;
class bar {
foo a;
public:
bar(foo a = a1) : a(a) {
a.a = 1;
cout << a.a << endl;
}
void print_a() {
cout << a.a << endl;
}
};
int main() {
bar zz;
zz.print_a();
a1.a = 2;
bar zz1;
zz1.print_a();
}
Run Code Online (Sandbox Code Playgroud)
输出是:
1
0
1
2
Run Code Online (Sandbox Code Playgroud)
我也希望能够改变我的类的内部成员的价值观,就像一个对象的值FOO类内部酒吧类.当我在bar构造函数中更改 …
如何制作输出NOT(x)的程序?
例:
解释:
01至10
printf("%i\n%i\n%i\n", ~12, ~0, ~2);
打印:
-13
-1
-3
printf("%i\n%i\n%i\n", !12, !0, !2);
Run Code Online (Sandbox Code Playgroud)
打印:
0
1
0
Run Code Online (Sandbox Code Playgroud) 这是什么意思?我一直在程序中看到它并且我没有得到它:
int *array[9];
Run Code Online (Sandbox Code Playgroud)
为什么星号在那里.这个声明和这个有什么区别:
int array[9];
Run Code Online (Sandbox Code Playgroud) 例如:
我有一个输入= 0x5A ( 0101 1010 ).
我想存储前4位或后4位.
我有一个由五个值组成的字符串,每个值用空格分隔.
std::string s = "123 123 123 123 123";
Run Code Online (Sandbox Code Playgroud)
如何将这些分成五个整数的数组?
有没有办法获得以null结尾的字符串的大小?
防爆.
char* buffer = "an example";
unsigned int buffer_size; // I want to get the size of 'buffer'
Run Code Online (Sandbox Code Playgroud) 我试图在C++中连接两个字符串:
"G1-2" + "-%02d.jpg"
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
G1-2-1537817269.jpg
Run Code Online (Sandbox Code Playgroud)
为什么不是这样的结果: "G1-2-%02d.jpg"