我有一个在程序开头初始化为NULL的char指针,在程序中,char *在函数调用中使用,它可能指向一个char字符串,它可能指向null char,它可能保持不变。 所以下面的语句是正确的,应该是从左到右计算表达式。如果没有,那么 strlen(charpointer) 是未定义的行为,如果 charpointer == NULL
if ( charpointer == NULL || strlen ( charpointer ) == 0 )
那么,他们是否从左到右进行评估?这是正确的检查方法吗?
答案 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)
从左到右的评估顺序。
在你的情况下,如果循环将从左到右检查第一个条件。如果第一个条件失败,它将从左到右检查第二个条件。