Как работает max в качестве переменной, хотя обычно это функция? - PullRequest
0 голосов
/ 01 мая 2020

Я нахожусь в C ++ 6 месяцев, только практикую проблемы с алгоритмом, но я знаю не более того.

как это работает? объявляя max как переменную, хотя обычно это функция? не должен ли компьютер их запутать? (или, по крайней мере, я думаю, что это функция, поскольку она отображается зеленым цветом на C ++), что я имею в виду, как компьютер узнает, когда я использую max в качестве переменной и когда я использую ее в качестве функции?

Спасибо!

1 Ответ

0 голосов
/ 01 мая 2020

Scope.

max - переменная заменит max - функцию или max - тип, если она объявлена ​​в более узкой области видимости. Компиляция завершится неудачей, если вы объявите max -функцию и max переменную в той же области видимости или введете неоднозначность.

Давайте рассмотрим несколько примеров:

int max(int x, int y);
int max;
int main()
{
    max = max(10,4);
}

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

namespace test
{
    int max(int x, int y);
}
using namespace test;
int max;
int main()
{
    max = max(10, 4);
}

Это также не может быть скомпилировано, потому что оператор using указывает, какой max вы хотите получить неоднозначный, даже если оба max находятся в разных областях. Этот случай можно исправить, удалив неоднозначность: ::max = test::max(10, 4);.

int max(int x, int y);
int main()
{
    int max = max(10, 4);
}

Этот случай не выполняется, поскольку int max находится в более узкой области и заменяет int max(int x, int y). Здесь нет двусмысленности; код пытается вызвать int как функцию, а функция max больше не видна.

int max(int x, int y);
int main()
{
    int max = 42;
}

полностью действительна. max однозначно, int и max не используются в качестве функции.

Примечание: int max = max; скомпилируется, но max будет инициализирован с его неинициализированным я. Не очень полезно, но я уверен, что есть какой-то странный трюк, который может воспользоваться этим поведением.

Есть немного больше свободы с max типом.

struct max
{

};
max max;

допустимо, но

struct max
{

};
max max;
max fail;

нет. После max max, max является переменной и max -тип теряется. Избавьтесь от этого, избегайте всегда популярных string string; и map map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...