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

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

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

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

||的评估顺序 从左到右,正如埃里克所说,这是||一个特殊属性 和&& ,大多数运营商不强制执行从左到右的疏散。 如果左边一个成功,它将不会评估正确的表达,来自C99标准草案6.5.14 第4段

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

C ++草案标准在第5.15第1段中有类似的语言。

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

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

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

它的行为主要由||的属性定义 运算符,保证从左到右进行求值,第一个操作数的评估在第二个操作数的评估之前被排序,并且在第一个操作数评估为true情况下具有“过早完成”(“短路”)。

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

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

这两种情况都属于这种情况 和&&。

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

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

  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. 

评估顺序从左到右。

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