Что такое int a = (i * + 3); а как c компилятор его выполнит? - PullRequest
2 голосов
/ 11 февраля 2020

ЗДЕСЬ КОД

int i = 3
int a=(i*+3);

НЕ ПОНИМАТЬ КОД

a=(i*+3)

значение = 9


Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Это просто плохое форматирование кода. Чтобы сделать декларацию понятной, перепишите ее как

int i = 3;
int a = i * +3;

, вставляя пробелы между токенами. Хотя унарный оператор плюс здесь избыточен.

Еще одно запутанное выражение

int a = i+++3;

Это то же самое, что и

int a = i++ + 3;

Из C стандарта (6,4 лексических элементов)

4 Если входной поток был проанализирован в токены предварительной обработки до заданного символа, следующий токен предварительной обработки - это самая длинная последовательность символов, которая может составлять токен предварительной обработки.

Вы можете получить много такие запутанные выражения пропускают пробелы между токенами.

Хотя в C есть темные углы, о которых вы должны знать.

Например, если у вас есть объявление функции, например

void f( int x );

, тогда ее можно вызвать как

(**********f)( 10 );

, что эквивалентно

f( 10 );

Вот демонстрационная программа

#include <stdio.h>

void f( int x )
{
    printf( "I'm called with %d stars!\n", x );
}

int main(void) 
{
    ( **********f )( 10 );

    return 0;
}

Ее вывод

I'm called with 10 stars!
1 голос
/ 11 февраля 2020

Контекст использования в C необходим для понимания нескольких многоцелевых символов, таких как символ +, который сам по себе имеет как минимум 3 использования, обычно встречающихся в выражениях C:

  • оператор сложения (например, int a = 3 + 5;)
  • знак, указывающий положительное значение (например, int a = +3 - (+3);)
  • и, при удвоении, инкрементатор значения. (for(int a=0; a<limit; a++))

При использовании с другими многоцелевыми символами, такими как *, определение, является ли это знак , оператор или инкремент по контексту использования.

Обычно в этом контексте вы бы использовали неявный знак +:

int a=(i*3);// i * +3

Но также допустимо (но не так читаемо) использование явного подписать. Таким образом, в контексте использования в этом утверждении ...

int a=(i*+3);// by context '+' is a sign in this case, not an operator

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

Более читабельный версия:

int a=(i * (+3));

Еще один похожий, по-видимому, запутанный сценарий, но контекстуально значимый:

int func(int *value){

    int a = 10+*value;//by context '*' is de-referencing 'value' not multiplying
    return a;
}

Примечание: удобочитаемость могла бы быть улучшена с помощью пробелов:

int a = 10 + *value;  //spacing is good for readability and removing ambiguity
...