присвоение имеет два знака равенства - PullRequest
1 голос
/ 20 октября 2011

следующий код мы всегда используем и все в порядке,

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

но если поменять целые числа на указатели, как показано ниже, при компиляции возникнет ошибка.

#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 ]

6 голосов
/ 20 октября 2011

Из-за старшинства while(int c=getchar() != 'q'); неверно. Он всегда будет хранить результат сравнения значения, возвращаемого getchar() и q. Так что c всегда будет 1 или 0.

Вы, вероятно, хотите:

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

Или, может быть

while((c = getchar()) != EOF && c != 'q');
4 голосов
/ 20 октября 2011

Нет, приоритет оператора не изменился между двумя фрагментами кода.Следующее:

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

эквивалентно:

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

Здесь вызывается getchar(), его возвращаемое значение сравнивается с 'q', а является результатомсравнение сохраняется в переменной int c.

Другими словами, c не содержит только что прочитанный символ;он содержит логический индикатор, указывающий, был ли самый последний символ 'q'.

Поскольку c никогда не просматривается, код работает.Однако, это, вероятно, не то, что предполагалось.

3 голосов
/ 20 октября 2011

Вы действительно видите приоритет в действии.

!= имеет более высокий приоритет, чем =. Так

int* a =c !=0

разбирает как

int* a = (c !=0)

, который является присваиванием bool int*

...