C++ 使用&;在if语句中正确使用语法&;运算符和2个变量

C++ 使用&;在if语句中正确使用语法&;运算符和2个变量,c++,if-statement,syntax,operator-keyword,C++,If Statement,Syntax,Operator Keyword,我有一个关于正确使用语法的快速问题,基本上我试图将这两个if语句总结为一个if语句 if (sc.LastCallToFunction) { if (p_LowRectanglesList != NULL) { free(p_LowRectanglesList); sc.PersistVars->i1 = 0; } if (p_HighRectanglesList != NULL) { free(p_HighRecta

我有一个关于正确使用语法的快速问题,基本上我试图将这两个if语句总结为一个if语句

if (sc.LastCallToFunction) {
    if (p_LowRectanglesList != NULL) {
        free(p_LowRectanglesList);
        sc.PersistVars->i1 = 0;
    }
    if (p_HighRectanglesList != NULL) {
        free(p_HighRectanglesList);
        sc.PersistVars->i2 = 0;
    }
    return;
将其改写为以下内容在语法上是否正确:

if (sc.LastCallToFunction) {
    if (p_LowRectanglesList || p_HighrectangleList != NULL) {
        free(p_LowRectanglesList && p_HighRectanglesList);
        sc.PersistVars->i1 && sc.PersistVars->i2 = 0;
    }
    return;

或者编译器不会接受这个/我的逻辑有问题吗?

你不能按照你给出的方式来做

if (p_LowRectanglesList || p_HighrectangleList != NULL)
这在逻辑上对第一个指针进行or(将其视为true或false),并将第二个指针与NULL进行比较

free(p_LowRectanglesList && p_HighRectanglesList);
这在逻辑上将指针放在一起,然后尝试释放该操作的结果。也就是说,你试图释放“真”或“假”

这在逻辑上将这两件事相加,结果是真或假,然后尝试将0赋给它。。。。。没有任何意义


另外,在你的原始代码中…在免费之后,你应该把
p_LowRectanglesList=NULL 

你的逻辑非常错误。你几乎不应该在C++中调用For()。您应该很少使用delete。查找“RAII”-它将使一切变得更好。我明白了,那么如果我将它重写为:if((p_LowRectanglesList!=NULL)|(p_HighRectanglesList!=NULL))这是解决我的问题的合法语法解决方案吗?这是if语句的正确语法,但对您没有帮助。。。您仍然需要独立地检查每个指针,并分别释放每个指针。if语句只告诉您这两个指针中至少有一个不是null。那没有多大用处。您需要检查每个指针以查看其是否为非空,如果为非空,则释放它。但是,在C#中,如果我使用&it同时检查这两个指针,并且如果使用&it,则将停止检查第一个指针是否满足该条件。在这种情况下,我真的很难找到适合C++的语法。为了公平起见,对于我的程序来说,这种语法应该足够了,因为如果其中一个指针不为null,那么其余的指针将运行。这并不是说我真的需要将我发布的两条语句结合起来,只是我在寻找更优雅的方式来编写代码,而且我还停留在语法上。有任何建议,因为我找不到任何关于CPLUS的东西。你有几个选择,第一个选择是用C++的方式。正如有人在对您的问题的评论中所说的那样,这是RAII,并使用范围或共享ptr/唯一ptr之类的东西(取决于你是否有boost或C++0x。另一种方法更像是你目前所用的C方式,你可以做一个函数,检查指针是否为NULL,如果不是,则释放它,然后在释放它后将其设置为NULL。好吧,我会读到RAII tommorow,但我不得不说这让我非常恼火在C·vs. C++中,我需要担心垃圾收集是多么容易实现的……看起来,在这一点上,只允许让语法像我原来的代码一样简单,我想“压缩”。代码,从而使其更加优雅,但这似乎不是一个不牺牲一些功能的选项。感谢您的帮助/建议,我已将您的答案检查为已接受的答案。尽管如此,这是一个遗憾=/
sc.PersistVars->i1 && sc.PersistVars->i2 = 0;