作业有两个等号

时间:2011-10-20 07:01:29

标签: c++ compiler-errors assignment-operator

以下代码我们总是使用并且没问题,

while(int c=getchar() != 'q');

但如果将int更改为如下所示的指针,则编译将出现错误。

#include <stdio.h>
int main(){
  int* c=0;
  if(int* a =c !=0)
    printf("ok");
}

error: cannot convert `bool' to `int*' in assignment

这里发生了什么?似乎优先事项已经改变。任何人都可以给我一个提示。如果我将其更改为此,它将起作用。

#include <stdio.h>
int main(){
  int* c=0;
  int* a;
  if((a =c) !=0)
    printf("ok");
}

3 个答案:

答案 0 :(得分:6)

由于优先权,while(int c=getchar() != 'q');是错误的。它将始终存储比较getchar()q返回的值的结果。因此 c始终为10

你可能想要:

int c;
while((c = getchar()) != 'q');
      ^             ^

或者

while((c = getchar()) != EOF && c != 'q');

答案 1 :(得分:4)

不,两个代码段之间的运算符优先级没有变化。以下内容:

while(int c=getchar() != 'q')

相当于:

while(int c = (getchar() != 'q'))

此处调用getchar(),将其返回值与'q'进行比较,比较结果存储在int变量{{ 1}}。

换句话说,c不包含刚读过的字符;它包含一个布尔指示符,指示最近的字符是c

由于永远不会查看'q',因此代码可以正常工作。但是,它可能不是预期的。

答案 2 :(得分:3)

你确实看到了行动的优先权。

!=的优先级高于=。所以

int* a =c !=0

解析为

int* a = (c !=0)

这是boolint*

的分配