检查指针是不是NULL通过简单写入if(pointer)或我必须使用它是否安全if(pointer != NULL)?
ANSI标准是否要求逻辑运算符在C或C++中被短路?
我很困惑,因为我记得K&R的书说你的代码不应该依赖于这些操作被短路,因为它们可能没有.有人可以指出标准中的哪个位置逻辑操作始终是短路的吗?我最感兴趣的是C++,C的答案也很棒.
我还记得读(不记得在哪里)评估顺序没有严格定义,所以你的代码不应该依赖或假设表达式中的函数将按特定的顺序执行:在语句的末尾所有引用的函数将被调用,但编译器可以自由选择最有效的顺序.
标准是否表明该表达式的评估顺序?
if( functionA() && functionB() && functionC() ) cout<<"Hello world";
Run Code Online (Sandbox Code Playgroud) c c++ operator-precedence short-circuiting logical-operators
在许多语言中,作业在条件上是合法的.我从来不明白这背后的原因.你为什么要写:
if (var1 = var2) {
...
}
Run Code Online (Sandbox Code Playgroud)
代替:
var1 = var2;
if (var1) {
...
}
Run Code Online (Sandbox Code Playgroud) 在Stroustrup的The C++ Programming Language:Special Edition(3rd Ed)中,Stroustrup写道,控制语句条件中的变量声明和初始化不仅是允许的,而且是鼓励的.他写道,他鼓励它,因为它将变量的范围缩小到只有它们所需的范围.所以像这样......
if ((int i = read(socket)) < 0) {
// handle error
}
else if (i > 0) {
// handle input
}
else {
return true;
}
Run Code Online (Sandbox Code Playgroud)
...是很好的编程风格和实践.该变量i仅存if在于需要它的语句块中,然后超出范围.
但是,g ++(版本4.3.3 Ubuntu特定编译)似乎不支持编程语言的这个特性,这对我来说是令人惊讶的.也许我只是用一个标志来调用g ++来关闭它(我称之为的标志是-g和-Wall).在使用这些标志进行编译时,我的g ++版本返回以下编译错误:
socket.cpp:130: error: expected primary-expression before ‘int’
socket.cpp:130: error: expected `)' before ‘int’
Run Code Online (Sandbox Code Playgroud)
在进一步的研究中,我发现我似乎并不是唯一一个不支持此编译器的编译器.并且在这个问题中似乎存在一些混淆,因为确切地说语言在语言中是什么标准,以及编译器使用它编译什么.
所以问题是,什么编译器支持这个功能以及需要设置哪些标志才能编译?这是某个标准而不是其他标准的问题吗?
另外,出于好奇,人们普遍认同Stroustrup这是好风格吗?或者这是一种语言的创造者在他脑海中获得一个想法的情况,这个想法不一定得到语言社区的支持?
看起来
if (x=y) { .... }
Run Code Online (Sandbox Code Playgroud)
代替
if (x==y) { ... }
Run Code Online (Sandbox Code Playgroud)
是许多邪恶的根源.
为什么并非所有编译器都将其标记为错误而不是可配置警告?
我有兴趣找出构造if (x=y)有用的案例.
可能重复:
无意中使用=而不是==
C++编译器通过您编写的警告让您知道
if( a = b ) { //...
Run Code Online (Sandbox Code Playgroud)
并且这可能是一个错误,你当然想写
if( a == b ) { //...
Run Code Online (Sandbox Code Playgroud)
但有没有一种情况应该忽略警告,因为这是使用这个"功能"的好方法?我没有看到任何代码清晰度可能的原因,那么它有用吗?
我有两个标准容器.它们都指向相同的数据结构.第一个包含所有数据,第二个包含一些相同的数据.我应该使用shared_ptr或weak_ptr在第二个容器上?
首先,当我阅读我想unique_ptr在第一个集合上使用的参考时.我的第一个集合包含所有数据,它是唯一一个"拥有"的数据.这意味着如果数据不存在,则应将其删除.但是当我尝试创建第二个集合时,我不知道该怎么做.我创建了一个唯一的指针,但现在我需要另一个指向同一元素的指针来破坏唯一性,但事实上真正的所有者并不是新的指针.所以我理解(我希望我没有错),唯一性是在达到元素的方式而不是(例如)删除元素的可能性.所以,shared_ptr.我在他的第一个系列中有它们.但是现在第二个出现了,我想用了shared_ptr这里也.访问相同数据的方式可能都是,因此所有者是两个.但在我的情况下,数据总是从之前的第二个删除.如果我使用a weak_ptr,所有者的数量不会增加.在这两种情况下,当第一个集合需要时,元素将被删除.最后我正在使用shared_ptr因为weak_ptr我需要lock()每行代码中的每个指针,使其可读性降低.但我应该真正使用什么?
因此,我想对类中的向量进行一些错误检查,以便在将新项添加到向量之前查看该项是否已存在.
ClassA cpp
void ClassA::func(std::shared_ptr<ClassB> new_item)
{
for(auto items : vector_)
{
if(items = new_item)
{
return;
}
vector_.push_back(new_item);
}
}
Run Code Online (Sandbox Code Playgroud)
vector_是成员类成员std :: vector.使用此当前实现,所有new_item都被忽略,即使它不是重复的.我知道'if(items = new_item)'是有问题的一行,但我不知道为什么.
每个人。
int x{};
if (x = 0)
std::cout << "condition true";
else
std::cout << "condition false";
Run Code Online (Sandbox Code Playgroud)
我不明白为什么 x=0 计算结果为布尔 false 并执行“条件 false”。x=0 是一个赋值,并且 x 的值为 0 那么为什么它的计算结果不为 true ?
c++ ×8
c ×3
if-statement ×2
c++11 ×1
conditional ×1
declaration ×1
null ×1
null-pointer ×1
pointers ×1
shared-ptr ×1
vector ×1