我想知道如何在 C/C++ 中处理多个条件。我有一些运行良好的代码,但我担心这涉及到运气因素,我不想被抓住。考虑:
if ( (/*condition1*/) || (/*condition containing invalid reference*/) )
{
// do something
}
只要“条件 1”为 TRUE,即使条件本身会产生故障,第二个条件似乎也不会产生错误。例如:
int main()
{
char string1[] = "StackOverflow";
char *string2 = 0;
// (1) This will work because string1 is valid
if (strlen(string1) != 0)
printf("%s", string1);
// (2) This will cause an error
if (strlen(string2) != 0)
printf("%s", string2);
// (3) But this if(OR) works fine
if ((strlen(string1) != 0)||(strlen(string2) != 0))
printf("no problem!");
// (4) And of course this doesn't
if ((strlen(string2) != 0)||(strlen(string1) != 0))
printf("I don't believe it!");
return 0;
}
从 OR 条件列表可以看出,if()“问题”在第一个 TRUE 语句处停止,从左到右阅读,无论后面是什么。但是,将数字 (3) 更改为:
if ((strlen(string1) == 0) && (strlen(string2) == 0)
尽管第一个条件为假,但仍然会失败,从而将整个事情呈现为假 - 即问题不会像 OR 示例那样停止。
概括地说,我观察到以下几点:
if ( (TRUE) or (INVALID) ) -> no problem
if ( (FALSE) or (INVALID) ) -> error
if ( (TRUE) and (INVALID) ) -> error
if ( (FALSE) and (INVALID) ) -> error // see the EDIT
这些结果在所有情况下都是通用的,还是依赖于编译器/平台?
我可以按照上述规则编写代码,还是永远不要陷入其中一个条件无效的情况?
我正在为我的老板检查一些旧代码,其中充斥着上面 (3) 之类的示例。将它们全部捕获并调整代码以避免任何无效条件将需要相当长的时间。虽然(3)和(4)可以很容易地调整到一个if(string2 != 0) { // }
块内,但对于我拥有的代码来说,在实践中并不是那么容易。
编辑:
由于再次检查,if ( (FALSE) and (INVALID) )
确实运行没有错误。我不知道为什么它之前失败了;如果它最初有效,我什至可能都没有提出这个问题。我会把它归结为巫术和注意力不集中。
最终,虽然已经暗示了答案但没有逐字确认,但似乎这种对短路评估的依赖(感谢维基链接!)是一种合法的技术。我很高兴我不必重新编写任何代码!