为什么规范要求写null==obj而不是obj==null
时间: 2023-10-01 10:11:28 浏览: 92
规范要求写`null==obj`而不是`obj==null`是因为在一些语言中,比如Java,使用`=`符号进行赋值时,如果不小心将`==`写成了`=`, 就会导致程序出现逻辑错误。而将`null`放在前面,就能够避免这个问题,因为如果不小心将`=`写成了`==`,编译器会提示错误。此外,将`null`放在前面也可以让代码更加易读,因为`null`是一个常量,而变量通常是排在前面的。
相关问题
为什么要写成null==obj
将`null`放在表达式的左侧,例如`null==obj`,是一种编程习惯,被称为“Yoda 表达式风格”(Yoda Conditions)。这种风格得名于星球大战中的 Yoda 角色,因为他的语言特点是将谓语放在主语之后,例如“Powerful you have become, the dark side I sense in you”(你变得强大了,我感受到你身上的黑暗面)。Yoda 表达式风格也是将常量或字面量放在表达式的左侧,而将变量放在右侧。
使用`null==obj`这种写法的好处是,如果不小心将`==`写成了`=`,例如`null=obj`,编译器会提示错误,因为不能将值赋给常量。而如果使用`obj==null`这种写法,将`==`写成`=`时,编译器不会报错,而是将`null`赋值给`obj`,可能会导致程序出现逻辑错误。因此,使用`null==obj`这种写法可以减少编程错误的发生,提高代码的可读性和可维护性。
typedef struct { int *base; int front; int rear; int num,size; } MyCircularQueue; MyCircularQueue* myCircularQueueCreate(int k) { MyCircularQueue *obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue)); if(!obj) return NULL; obj->base=(int*)malloc(k*sizeof(int)); obj->front=obj->rear=0; obj->num=0; obj->size=k; return obj; } bool myCircularQueueIsEmpty(MyCircularQueue* obj); bool myCircularQueueIsFull(MyCircularQueue* obj); bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) { if(myCircularQueueIsFull(obj)) return false; obj->rear=(obj->rear+1)%obj->size; obj->base[obj->rear]=value; obj->num++; if(obj->num==1) obj->front=obj->rear; return true; } bool myCircularQueueDeQueue(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return false; obj->base[obj->front]=-1; obj->front=(obj->front+1)%obj->size; obj->num--; return true; } int myCircularQueueFront(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return -1; else return obj->base[obj->front]; } int myCircularQueueRear(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return -1; else return obj->base[obj->rear]; } bool myCircularQueueIsEmpty(MyCircularQueue* obj) { return(obj->num==0); } bool myCircularQueueIsFull(MyCircularQueue* obj) { return(obj->num==obj->size); } void myCircularQueueFree(MyCircularQueue* obj) { free(obj->base); obj->base=NULL; free(obj); obj=NULL; } /** * Your MyCircularQueue struct will be instantiated and called as such: * MyCircularQueue* obj = myCircularQueueCreate(k); * bool param_1 = myCircularQueueEnQueue(obj, value); * bool param_2 = myCircularQueueDeQueue(obj); * int param_3 = myCircularQueueFront(obj); * int param_4 = myCircularQueueRear(obj); * bool param_5 = myCircularQueueIsEmpty(obj); * bool param_6 = myCircularQueueIsFull(obj); * myCircularQueueFree(obj); */
这段代码实现了一个循环队列(Circular Queue),使用了一个结构体 MyCircularQueue 来存储队列的相关信息。以下是对每个函数的解释:
1. `myCircularQueueCreate`:用于创建一个容量为 k 的循环队列对象,并返回该对象的指针。
2. `myCircularQueueIsEmpty`:判断循环队列是否为空,如果为空则返回 true,否则返回 false。
3. `myCircularQueueIsFull`:判断循环队列是否已满,如果已满则返回 true,否则返回 false。
4. `myCircularQueueEnQueue`:将元素 value 入队,如果队列已满则返回 false,否则将 value 插入到 rear 指向的位置,并更新 rear 和 num 的值。
5. `myCircularQueueDeQueue`:将队头元素出队,如果队列为空则返回 false,否则将 front 指向的位置置为 -1,并更新 front 和 num 的值。
6. `myCircularQueueFront`:返回队头元素的值,如果队列为空则返回 -1。
7. `myCircularQueueRear`:返回队尾元素的值,如果队列为空则返回 -1。
8. `myCircularQueueFree`:释放循环队列对象及其内部分配的内存空间。
注意,在使用循环队列时,请按照注释中的示例代码进行实例化和调用相应的函数。
阅读全文