我一直认为只会if(p != NULL){..}做这项工作.但在阅读Stack Overflow问题后,似乎没有.
那么在吸收了那个说明NULL指针可能具有非零值的问题的所有讨论之后检查NULL指针的规范方法是什么?
我不明白指针在for循环中的作用.什么是*p在下面的循环呢?
char str[128] = "Some Text";
char *p;
for (p = str; *p /*what does this mean?*/; p++)
{
// Code
}
Run Code Online (Sandbox Code Playgroud)
我确实了解其余的,但为什么不*p喜欢p > 3或类似的东西?
为什么一个人?
为什么这样写?
我最近失去了一些时间来弄清楚我的代码中的错误是由一个错字引起的:
if(a=b)
Run Code Online (Sandbox Code Playgroud)
代替:
if(a==b)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何特殊情况你想要在if语句中为变量赋值,或者如果没有,为什么编译器不会发出警告或错误?
我已经检查了这篇文章我可以使用if(指针)而不是if(指针!= NULL)吗?网上还有其他一些帖子.
但它没有说两个陈述之间有任何区别.
问题:当我在cpp代码上运行cpplint.py时,我发现了检查指针为NULL的问题.我更喜欢用简单的方法来检查
if(pointer) //statement1
Run Code Online (Sandbox Code Playgroud)
但是cpplint说你应该检查一下
if(pointer != NULL) //statement2
Run Code Online (Sandbox Code Playgroud)
所以我只想知道,statement2对statement1有什么好处吗?是否存在一些语句可能会产生问题?
工作:据我所知,这两个陈述的工作没有区别.它只是改变了编码风格.
我更喜欢使用like statement1,因为
- 它简单易读
- 没有张力
=错误(==)在比较中错误地超过了()
但是cpplint正在提出这个问题,那么我可能会有一些好处.
注意: Java也不支持statement1.
所以,如果你这样做:
void *ptr = NULL;
Run Code Online (Sandbox Code Playgroud)
检查该void指针是否为NULL的最佳方法是什么?
我现在的解决方法是:
if (*(void**)ptr == NULL) ...
Run Code Online (Sandbox Code Playgroud)
但这似乎不是最好的方法,因为我隐含地假设ptr是void**类型(它不是).
假设我有一个指针:int *pointer.
如果我想测试它的可空性,我应该这样做:
bool nullability = !pointer;
Run Code Online (Sandbox Code Playgroud)
或者:
bool nullability = (pointer == nullptr);
Run Code Online (Sandbox Code Playgroud)
两个表达都是等价的吗 如果没有,为什么以及副作用是什么?
有人可以解释while(foo)vs while(foo != NULL)是如何相同的?也:
while(!foo) VS while(foo == NULL)
我知道 !不是,但这就是我所知道的.
让我们说我有一个指针
MyType *ptr;
Run Code Online (Sandbox Code Playgroud)
当用旧标准在"真值 - 值上下文"中检查该指针的有效性时,我会写这样的东西
if (ptr) { ... // 1
while (ptr) { ... // 2
Run Code Online (Sandbox Code Playgroud)
问题在于,在这样的"真值上下文"中,我们期望将指针隐式转换为布尔值,因此我们将进行比较
if (NULL != ptr) { ...
while (NULL != ptr) { ...
Run Code Online (Sandbox Code Playgroud)
然而,0弃用了与整数的宏进行比较,C++ 11建议进行比较nullptr.
在真值期间的情况下,如上面的(1)或(2),我们没有明确说
if (nullptr != ptr) { ...
while (nullptr != ptr) { ...
Run Code Online (Sandbox Code Playgroud)
什么是我们的指针比较?它转换为布尔值?我们必须明确地比较nullptr吗?
这是C和C++的样式问题.你比较喜欢哪个
void f() {
const char * x = g();
if (x == NULL) {
//process error
}
// continue function
}
Run Code Online (Sandbox Code Playgroud)
或这个:
void f() {
const char * x = g();
if (! x) {
//process error
}
// continue function
}
Run Code Online (Sandbox Code Playgroud)
?前者更清晰,但后者则不那么冗长.
c ×5
c++ ×5
pointers ×5
arrays ×1
c++11 ×1
coding-style ×1
cpplint ×1
for-loop ×1
if-statement ×1
null ×1
null-pointer ×1
string ×1
while-loop ×1