以下代码我们总是使用并且没问题,
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");
}
答案 0 :(得分:6)
由于优先权,while(int c=getchar() != 'q');
是错误的。它将始终存储比较getchar()
和q
返回的值的结果。因此 c
始终为1
或0
。
你可能想要:
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)
这是bool
到int*