Как предотвратить нежелательное присвоение переменной внутри оператора условия? - PullRequest
0 голосов
/ 29 января 2019

Отсутствует знак равенства внутри присваивания (ввод = вместо ==) делает нежелательное присваивание внутри оператора условия.Например, рассмотрим сценарий, приведенный ниже (этот пример на языке C, но вопрос действителен и для интерпретируемого кода).

CASE A:

int g=1;

if ( g == 3 )
{
    printf("g is 3");   
}
else
{
    printf("g is not 3"); 
}

//this return: "g is not 3"

CASE B: (опечатка: отсутствует = внутреннее условие)

int g=1;

if ( g = 3 )
{
    printf("g is 3");   
}
else
{
    printf("g is not 3");
}

//this return: "g is 3" because of the assignment

Оба случая формально верны, поэтому код будет работать, но не так, как мы хотим;и может быть трудно отладить.

Как предотвратить эту ситуацию?Есть решение, которое охватывает интерпретируемый код (например, javascript), кроме статических анализаторов?

1 Ответ

0 голосов
/ 29 января 2019

Дело в том, что использование присваивания внутри тела условия для if, while или for является совершенно допустимым C и очень часто используется намеренно.Например, я часто использую следующий скелетный код для создания окна при написании графического интерфейса Win32 API:

if((hWnd = CreateWindowExW(...)) == NULL)
{
    MessageBoxW(NULL, L"Window creation failed", L"Error", MB_OK | MB_ICONSTOP);
    return GetLastError();
}

Если тест предназначен исключительно для равенства и вы хотите избежать использования оператора =случайно одна вещь, которую вы можете сделать, это привыкнуть помещать значение r в левую часть оператора, так что, если вы случайно используете =, это вызовет ошибку компиляции:

char *p = malloc(100000);
if(NULL == p)
{
    // handle null pointer
}

Очевидно, что это работает, только если хотя бы одна сторона сравнения является r-значением или const переменной.

...