如果(……),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.
评估顺序从左到右。
在你的情况下,如果循环将从左到右检查第一个条件。 如果第一个条件失败,它将从左到右检查第二个条件。