如果(...),if括号中的语句评估顺序是什么?

时间:2013-08-26 18:28:31

标签: c++ c

我有一个在程序开头初始化为NULL的char指针,在程序中,char *在函数调用中使用,它可能指向一个char字符串,它可能指向null char,它可能保持不变。 所以下面的语句是正确的,应该是从左到右计算表达式。如果没有,那么 strlen(charpointer) 是未定义的行为,如果 charpointer == NULL

if (  charpointer == NULL || strlen ( charpointer ) == 0  )

那么,他们是否从左到右进行评估?这是正确的检查方法吗?

5 个答案:

答案 0 :(得分:11)

||的评估顺序是从左到右,因为Eric提到这是||&&的特殊属性,大多数操作员不强制执行从左到右的撤离。如果左侧成功,则不会评估正确的表达式,来自C99标准草案部分6.5.14 第4段

  

与按位|不同运算符,||运算符保证从左到右的评估; 在评估第一个操作数后有一个序列点。 如果第一个操作数比较不等于0,则不评估第二个操作数

C ++草案标准在5.15 第1段部分中使用了类似的语言。

答案 1 :(得分:4)

评估过程的特征与if语句完全无关。评估由表达式本身的属性决定。在if中使用它的事实没有任何区别。

在您的情况下,有问题的表达是

charpointer == NULL || strlen ( charpointer ) == 0

其行为主要由||运算符的属性定义,保证从左到右进行计算,第一个操作数的评估在第二个操作数的评估之前进行排序,并且“过早完成”(“如果第一个操作数计算为true,则短路“)。

这意味着您原始帖子中的控制表达式是完全安全的。

答案 2 :(得分:2)

评估顺序如其他人从左到右所示,但重要的是要认识到评估在可以确定逻辑表达式的真实性(或缺乏真实性)时停止。

两者都是这种情况和&&。

这一点特别重要,因为您不能假设将对整个表达式进行求值,因此如果逻辑表达式的任何组件具有副作用(例如函数调用,增量,赋值等),则它们并非全部必须被执行。

答案 3 :(得分:2)

测试charpointer以查看它是否为空。

   if (charpointer == NULL) { // etc.

如果要测试charponter是否指向NULL char,则:

   if ((charpointer != NULL) && (strlen(charpointer) == 0) { // etc.

您可以将这些语句组合为:

   if (charpointer == NULL) {

   } else {
        if (strlen(charpointer) == 0) { // etc.

或作为:

   if ((charpointer != NULL) && (strlen(charpointer) == 0)) {// etc.

或者您可以依赖于您的代码所做的短路。但是,charpointer == NULL 必须的测试首先是因为表达式是从左到右计算的。

最后,在您编写了大量c代码后,您将了解到:

   if (! charpointer)  {  // etc.

与测试它等于NULL相同。所以,只是为了花哨并编写不可读的代码,然后:

   if (!charpointer || !(strlen(charpointer)) { // etc.

答案 4 :(得分:0)

从左到右的评估顺序。

在你的情况下,如果循环将从左到右检查第一个条件。如果第一个条件失败,它将从左到右检查第二个条件。