2009-11-06 3 views
2

Post пример выполнить инструкцию «C» без точки с запятой (;)Можно ли выполнить инструкцию «C» без запятой

+0

Что это? Домашнее задание? –

+0

Это не хороший вопрос. Пожалуйста, будьте более конкретным! void main (void) {} ​​- утверждение без ';' – Shirkrin

+0

@Shirkrin: Определение функции! = Statement –

ответ

3

Неправильный ответ

... с новым правом ответьте ниже.

int main(void) 
{ 
} 

Пара скобок в определении main является соединение-заявление, который является одним из допустимых форм для заявления.

Редактировать: хотя заявления может быть соединением-заявление и функции тела состоит из соединения-заявления, когда соединения-заявление является функцией тела , это не заявление .

Edit, Edit:

Эта программа не содержит заявление который выполняется, хотя:

int main(void) 
{ 
    if (1) {} 
} 
+1

Хм, не вижу там утверждения - просто объявление и пустая функция тело. – caf

+3

Тело функции состоит из составной инструкции. –

+0

Тело, если main является (составным) утверждением в соответствии с грамматикой C. –

10

Эта линия является утверждение:

while (0) { } 
+4

как «бой» while (1) {} '? По крайней мере, вы проделали какую-то работу :) –

+4

@Martinho: слишком утомительно. –

+0

И еще один интересный факт о '1' против' 0'. Тот, у которого есть '0', может быть оптимизирован ни к чему, а тот, у которого есть' 1', не может. –

8

Вы можете выражение в if(), если оно оценивается скаляром (целое число, плавающая точка t или указатель).

if (expr, 0) {} 

В соответствии с грамматикой C, expr является выражением. if(expr){} - selection_statement, так что это соответствовало бы счету.

Обратите внимание, что ,0 не всегда необходим, так как корпус if() пуст. Так что это было бы эквивалентно заявление, если expr возвращает скаляр:

if (expr) {} 
while (expr, 0) {} 
while (expr && 0) {} 
while (expr || 0) {} 

Все будет оценивать выражение один раз.

+1

Это не сделает его заявлением, а выражением. Тем не менее все это (if и фигурные скобки). –

+0

Не является вызовом функции, тоже? –

+0

, когда используется внутри выражения, это выражение. –

3

Используйте эту функцию:

__asm { 
    mov al, 2 
    mov dx, 0xD007 
    out dx, al 
} 
+6

Не оператор C, а проприетарная директива компилятора. – gnud

2

{ }

По крайней мере 15 символов требуется отправить ответ ...

1

Даже целая программа (мое GNU C построил его, несмотря на возвращенный код результата не определен). Вопрос: ПОЧЕМУ?

/* NEVER DO THIS!!! */ 
int main() 
{ 
    {} 
} 

И в C++, мы даже можем стабилизировать код возврата этой простой стек трюк с переменной (да, это грязно, я понимаю, но я думаю, что он должен работать в большинстве случаев):

/* NEVER RELY ON SUCH TRICKS */ 
int main() 
{ 
    if (int i=0) {} 
} 
+0

почему обратная совместимость, я думаю. Он просто выдает предупреждение. –

+0

К сожалению ... должно быть «почему мы должны закодировать что-то вроде этого» ... –

+0

+1 для трюка в стеке. –

1
int main() 
{ 
    // This executes a statement without a semicolon 
    if(int i = 10) 
    {  
    // Call a function 
    if(Fibonacci(i)) {} 
    } 

    // I have made my point 
    return 0; 
} 

int Fibonacci(int n) 
{ 
    return (n == 2) ? 1 : Fibonacci(n - 2) + Fibonacci(n - 1); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^