В C, будет ли !0 всегда возвращать 1?

#c #integer #zero

#c #целое число #ноль

Вопрос:

Эта программа анекдотически показывает, что целочисленное значение ! 0 равно 1 :

 #include <stdio.h>

int main( int argc, char* argv[] ) {
  printf( "%dn", ! 0 );
  return 0;
}
  
 $ gcc --version amp;amp; gcc -g ./main.c amp;amp; ./a.out
gcc (Debian 6.3.0-18 deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1
$
  

Гарантируется ли это каким-либо стандартом или может ! 0 когда-либо оцениваться до любого другого ненулевого целого значения?

Комментарии:

1. Стандарт ISO C должен объяснить это очень четко. Вы там смотрели?

2. @NateEldredge — действительно, это там, как показал ответ Джона. Честно говоря, я всегда боялся пытаться искать информацию таким образом — эти стандартные документы всегда казались такими большими и подавляющими; Я, честно говоря, поражен, что люди могут найти там информацию так быстро, как им кажется.

3. Это приходит с практикой. Не бойтесь, просто прочитайте и попытайтесь понять, что вы можете. С большей экспозицией это станет более знакомым.

4. @StoneThrow: разумный компромисс cppreference.com , который, несмотря на название, охватывает как C, так и C . Он довольно точно соответствует стандартам, но немного более удобен для пользователя. Он организован как стандарты, поэтому я нашел соответствующую страницу в разделе «C reference -> Expressions -> Operators: logical» и получил ответ: «Его значение равно 1, если выражение принимает значение, равное нулю».

5. @StoneThrow: они похожи на любую другую ссылку — начните с оглавления и индекса, и вы сможете найти то, что вам нужно.

Ответ №1:

Гарантируется, что оно будет равно 1 .

6.5.3.3 Унарные арифметические операторы

5 Результат оператора логического отрицания ! равен 0, если значение его операнда сравнивается неравным 0, 1, если значение его операнда сравнивается равным 0. Результат имеет тип int . Выражение !E эквивалентно (0==E) .

Онлайн-черновик C 2011