2013-04-13 2 views
3

Я дал образец для иллюстрации того, какой стиль присваивания я имею в виду в строке # 6.Является ли такой стиль назначения хорошо определенным?

1 #include<stdio.h> 
    2 
    3 int main(int argc,char *argv[]) 
    4 { 
    5   int a,b,c; 
    6   c = ({ a=5; b = a+1;}); 
    7   printf("%d\n%d\n%d\n",a,b,c); 
    8   return 0; 
    9 } 

Я не уверен, что {} is.It не Initializer список, используемый в массиве int arr[]={1,2,3}.


Update: Может быть с помощью этого метода можно определить функцию в функции или, возможно, ошибка в GCC (версия 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1))

1 #include<stdio.h> 
    2 #include<math.h> 
    3 int main(int argc,char *argv[]) 
    4 { 
    5   int a,b; 
    6   b = ({int cos(i){return 0;};a = 0;cos(a);}); 
    7   printf("%d\n%d\n",a,b); 
    8   b = cos(0); 
    9   printf("%d\n%d\n",a,b); 
10   return 0; 
11 } 

Выход:

0 
0 
0 
1 
+0

http://stackoverflow.com/questions/1635549/in-what-versions-of-c-is-a-block-inside-parenthesis-used-to-return-a-value-valid – DCoder

+0

Возможно, gcc - pedantic -wall - хороший выбор для меня – yuan

ответ

3
({ a=5; b = a+1;}) 

- расширение GNU, expression statement. Это не стандарт C.

Операторы в блоке выполняются, а значение последнего выражения в блоке - это значение выражения.

Так

c = ({ a=5; b = a+1;}); 

множество a до 5, а затем к ba+1 (6), и c к этому значению.


Что касается обновления,

b = ({int cos(i){return 0;};a = 0;cos(a);}); 

использует другое расширение GNU дополнительно nested functions. Внутри составной инструкции оператора выражения определена вложенная функция cos, затеняющая имя cos, объявленное в math.h, и поэтому cos(a), являющееся последним выражением в составной инструкции, вызывает вложенное локальное определение.

В строке 8, вложенная функция, конечно, не в объеме, так что

b = cos(0); 

называет один из math.h.

+1

Спасибо, @Alex за ссылку. Мой google-fu слишком медленный. –