代码之家  ›  专栏  ›  技术社区  ›  Anycorn

奇怪的C++警告

  •  2
  • Anycorn  · 技术社区  · 16 年前

    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编译器

    2 回复  |  直到 16 年前
        1
  •  4
  •   msw    16 年前

    我开始证明存在可以优化为常量的传递;我不能。正如anonymous所指出的,以前的代码可以提供编译器用来将表达式退化为常量的约束。

    #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 const ,编译器看不到 x 作为不变量。编译器似乎是超智能的,或者是坏的。

        2
  •  1
  •   anonymous    16 年前

    这个表达式前面的代码是什么?

    编译器可能会在函数中找到一个优化,这意味着每次条件的计算结果都是相同的。听起来编译器好像在告诉您,您的逻辑在某个地方有缺陷,您只需“return 0;”或“return 1;”就可以获得相同的效果。