C++ 奇怪的C++;警告

C++ 奇怪的C++;警告,c++,bit-manipulation,C++,Bit Manipulation,从EDG派生的某些编译器给我表达式没有效果警告 在这条线上 return 1 << ((i == j) + (k == l) + ((i == k) & (j == l))); return 1此表达式前面的代码是什么 编译器可能会在函数中找到一个优化,这意味着您的条件每次的计算结果都是相同的。听起来好像编译器在告诉你,你的逻辑在某个地方有缺陷,你可以直接“返回0”或“返回1;”来达到同样的效果。我开始证明存在可以优化为常数的传递性;我不能。正如anonymous所指出的,

从EDG派生的某些编译器给我
表达式没有效果
警告 在这条线上

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

return 1此表达式前面的代码是什么


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

我开始证明存在可以优化为常数的传递性;我不能。正如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;
}

在gcc和g++4.4.3下,未设置带有
-Wall
的警告。即使i、j、k和l声明为
const
,编译器也不会将
x
视为不变量。编译器似乎非常智能或已损坏。

您确定编译器无法读取这些值吗?没有更多的上下文就很难说。i、j、k、l等的类型是什么。@Martin绝对,它们来自runtimeArgh的动态数组,
l
,看起来像
1
。我不能强迫gcc对其中任何一个生成警告,逻辑[虽然过于复杂]似乎很合理。我的猜测是,您可能误解了警告的来源,没有提供实际的代码,或者存在编译器错误。我们需要知道函数是如何调用的。如果它被内联到代码的不同部分,并且您在该上下文中设置了i=j=k=l,那么该函数将被完全优化。您能给我们一份生成警告的“按参考”功能的副本吗?谢谢您的时间。我想我只是假设编译器在判断他人反馈时犯了错误。我尝试了非常相似的代码(范围为1..4,而不是0..2),并同意您的基本结果-使用GCC 4.2.1和GCC 4.5.1。在这种情况下,运算符是“
&&
”还是“
&
”,结果是相同的。通常情况并非如此。感谢您指出我对
&&
的错误转录,正如您所注意到的,这在两个比较运算符之间是等效的,没有副作用。谢谢。目前,我将假定编译器已损坏/过于谨慎。我能够克服警告,这对我来说已经足够好了
    //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)));
    }
#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