以下代码是否安全?
class B {
public:
int& b;
B (int& _b) :
b(_b) {}
};
B* foo() {
int a;
return new B(a);
}
Run Code Online (Sandbox Code Playgroud)
foo返回的对象中的引用是否会指向任何内容(因为int a超出范围)或编译是否计算出来?
如何编写编译器的人称之为?我知道这int a, b, c;叫做表达.但是这样的事情:int a = 2?或者a++,a=c等我没有任何想法.我在哪里可以找到这些条款?C标准还是买一本关于编译器构造的书?我希望这很清楚.提前致谢.
我的意思是在迭代器指向同一元素的情况下.
在http://www.cplusplus.com/reference/stl/list/erase/上说"从列表容器中删除单个元素(位置)或一系列元素([first,last))." 并且"首先,最后一个迭代器指定要删除的列表容器中的范围:[first,last].即,范围包括first和last之间的所有元素,包括first指向的元素而不是last指向的元素. "
我完全不知道我是否做错了什么,但是对于我的代码的每一部分,我都没有在任何地方找到所需的信息,当我想自己测试时,我结束了某种情况,当我不知道发生了什么时在问这里并长时间争吵之后,我发现了类似"未定义的行为"的东西.那么有人可以更快地帮助我,现在是什么?
而且我想成为更好的程序员并找到比cplusplus.com和cppreference.com更好的资源,因为他们都很糟糕,还有更好的东西吗?我每天都使用这个C++变得更疯狂(但我仍然认为它对于快速的大型程序比Java或C更好),请帮忙.
调用迭代方法是否安全,例如STL容器擦除(覆盖2个迭代器),例如在我的情况下std::vector::erase(),两个参数都是vec.end()?我做了一个实验,看起来调用什么也没做,但我想确保我可以在代码中安全地使用它,否则我必须测试我的迭代器并避免erase()它们是相等的.
考虑一下代码:
int main() {
char orange[5];
for (int i = 0; i < 5; i++)
orange[i] = 1;
printf("orange: %d\n", *((char *)orange));
printf("orange: %d\n", *((int *)orange));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第一个print语句给了我一个值1,但是第二个print语句给了我一个值16843009.差异的原因是什么?
所以我真的希望这一切发生.我有一个整数变量,我想使用该变量在我的printf函数中给出间距,但C不允许我这样做,是否有任何解决方法.
#include<stdio.h>
int main(void){
int s = 5;
printf("%sd",s);
}
Run Code Online (Sandbox Code Playgroud)
非常感谢提前!
比如说,在下面的测试表达式中:
int ggg9 = fggg2() + (fggg3() && fggg4() < fggg5() * fggg6());
// 4 11 6 3
Run Code Online (Sandbox Code Playgroud)
如果我们遵循运算符优先级(在表达式下面的注释行中显示),我会假设首先计算parens中的表达式,然后将结果添加到fggg2().
因此,我假设它将按此顺序解决:
int r1 = fggg5() * fggg6(); //Precedence 3 (inside parens)
int r2 = fggg4() < r1; //Precedence 6 (inside parens)
int r3 = fggg3() && r2; //Precedence 11 (inside parens)
int ggg9 = fggg2() + r3; //Outside of parens, so it's last
Run Code Online (Sandbox Code Playgroud)
但是x86-64 gcc 8.2 解决它是这样的:
(我将它转换回C++)
int i0;
int r2 = fggg2();
int …Run Code Online (Sandbox Code Playgroud) 目前,我正在编写一些代码,以练习我在在线教程中研究的内容。在这段代码中,我使用指针使用“ new”分配了一些空间来创建类实例,并遍历它们以设置其名称。但是,我只能在指针位于第0位时删除它们。有人可以解释一下我是否对此想法有误,或者对此的一般规则是什么?
//头文件
#include <iostream>
using namespace std;
class Animal {
private:
string name;
int age;
public:
Animal(string name = "UNDEFINED", int age = 0): name(name), age(age) {cout << "Animal created" << endl;}
~Animal() {cout << "Animal killed" << endl;}
void setName(char name) {this->name = name;}
void speak() {cout << "My name is: " << name << ", and my age is: " << age << endl;}
};
Run Code Online (Sandbox Code Playgroud)
//主文件
#include "Animal.h"
int main() {
char name = 'a';
Animal *animals …Run Code Online (Sandbox Code Playgroud) 在C++中,如果我从一个字符串中读取一个整数,那么我是否使用u或d作为转换说明符并不重要,因为它们都接受负整数.
#include <cstdio>
using namespace std;
int main() {
int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);
puts(u == d ? "u == d" : "u != d");
printf("u: %u %d\n", u, u);
printf("d: %u %d\n", d, d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我挖得更深,发现是否有任何区别.我找到
int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);
Run Code Online (Sandbox Code Playgroud)
相当于
int u, d;
u = strtoul("-2", NULL, 10);
d = strtol("-2", NULL, 10);
Run Code Online (Sandbox Code Playgroud)
是否有任何差异之间的所有u和d使用解析这些转换说明,即传递给格式时scanf …