странное предупреждение C ++ - PullRequest
2 голосов
/ 18 августа 2010

определенный компилятор, полученный из EDG, выдает мне expression has no effect предупреждение на этой линии

return 1 << ((i == j) + (k == l) + ((i == k) & (j == l)));

значения являются значениями времени выполнения, компилятор их не знает.

return 1 << (((i == k) & (j == l))); // no warning here
return 1 << ((i == j) + (k == l)); //or here

Я что-то упустил или компилятор запутался?

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

    //static int symmetry(const int &i, const int &j, const int &k, const int &l) {
    static int symmetry(int i, int j, int k, int l) {
        // return 1 << ((i == j) + (k == l));
        //return 1 << (((i == k) && (j == l)) + (k != l));
        return 1 << ((i == j) + (k == l) + ((i == k) && (j == l)));
    }

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

спасибо за ваше время, я собираюсь предположить, что компилятор делает ошибку здесь. на тот случай, если вы обнаружите похожую проблему, компилятор nvcc, NVIDIA gpu cuda compiler

Ответы [ 2 ]

4 голосов
/ 18 августа 2010

Я начал доказывать, что существуют транзитивности, которые можно оптимизировать под постоянные; Я не мог Как отмечалось анонимно, предыдущий код может предоставить ограничения, которые компилятор использует для вырождения выражений в константы.

Но в случае сомнений выведите таблицу истинности:

#include <stdio.h>

int main() {
    int i, j, k, l, x;
    for(i = 0; i < 2; i++)
    for(j = 0; j < 2; j++)
    for(k = 0; k < 2; k++)
    for(l = 0; l < 2; l++) {
        x = ((i == j) + (k == l) + ((i == k) & (j == l)));
        printf("%d %d %d %d: %d, %d, %d -> %d\n", i, j, k, l, (i == j),
                (k == l), ((i == k) & (j == l)), x);
    }
    return 0;
}

Что дает:

0 0 0 0: 1, 1, 1 -> 3
0 0 0 1: 1, 0, 0 -> 1
0 0 1 0: 1, 0, 0 -> 1
0 0 1 1: 1, 1, 0 -> 2
0 1 0 0: 0, 1, 0 -> 1
0 1 0 1: 0, 0, 1 -> 1
0 1 1 0: 0, 0, 0 -> 0
0 1 1 1: 0, 1, 0 -> 1
1 0 0 0: 0, 1, 0 -> 1
1 0 0 1: 0, 0, 0 -> 0
1 0 1 0: 0, 0, 1 -> 1
1 0 1 1: 0, 1, 0 -> 1
1 1 0 0: 1, 1, 0 -> 2
1 1 0 1: 1, 0, 0 -> 1
1 1 1 0: 1, 0, 0 -> 1
1 1 1 1: 1, 1, 1 -> 3

Под gcc и g ++ 4.4.3 и без предупреждений с установленным -Wall. Даже если i, j, k и l объявлены const, компилятор не видит x как инвариант. Компилятор кажется либо трансцендентно умным, либо сломанным.

1 голос
/ 18 августа 2010

Какой код перед этим выражением?

Компилятор может найти оптимизацию в вашей функции, что означает, что ваше условие всегда оценивает один и тот же ответ каждый раз. Похоже, что компилятор говорит вам, что ваша логика где-то несовершенна, и вы можете просто "вернуть 0;" или «вернуть 1;» иметь тот же эффект.

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