可以(a == 1 && a == 2 && a == 3)在C或C++中评估为true吗?

Mys*_*cal 2 c c++

我们知道它可以用JavaJavaScript.

但问题是,可以在下面的条件永远评估为true 在C或C++?

if(a==1 && a==2 && a==3) 
    printf("SUCCESS");
Run Code Online (Sandbox Code Playgroud)

编辑

如果a整数.

PSk*_*cik 7

取决于你对"a是一个整数"的定义:

int a__(){ static int r; return ++r; }
#define a a__()  //a is now an expression of type `int`
int main()
{
    return a==1 && a==2 && a==3; //returns 1
}
Run Code Online (Sandbox Code Playgroud)

当然:

int f(int b) { return b==1&&b==2&&b==3; }
Run Code Online (Sandbox Code Playgroud)

将永远return 0;和优化者通常会完全取代支票.


Nic*_*tin 6

如果a是原始类型(即所有==&&运算符都是内置的)并且您处于已定义的行为中,并且在执行过程中没有其他线程可以修改a(这在技术上是未定义行为的情况 - 请参阅注释 - 但我把它留在这里因为它是Java问题中给出的例子),并且没有预处理器魔法(参见选择的答案),然后我不相信有任何方法可以评估为真.但是,正如您可以从条件列表中看到的那样,根据所使用的类型和代码的上下文,有许多场景表达式可以评估为true.

  • 如果一个线程可以在执行过程中修改该值并且`a`是一个原始类型,那么你将有未定义的行为,因此你处于已定义行为的早期条件已经涵盖了该条件. (5认同)

Eug*_*Sh. 6

如果我们抛开宏观魔法,我可以看到一种可以积极回答这个问题的方法.但它需要的不仅仅是标准C.我们假设我们有一个扩展允许使用__attribute__((at(ADDRESS)));属性,该属性将变量放在某个特定的内存位置(例如某些ARM编译器中可用,如ARM GCC).假设我们在地址处有一个硬件计数器寄存器ADDRESS,它会递增每次读取.然后我们可以这样做:

volatile int a __attribute__((at(ADDRESS)));
Run Code Online (Sandbox Code Playgroud)

volatile迫使编译器生成执行比较每次读取的寄存器,因此计数器将增加3倍.如果计数器的初始值是1,则该语句将返回true.

PS如果您不喜欢该at属性,可以使用链接描述文件通过放入a特定的内存部分来实现相同的效果.