我们知道它可以用Java和JavaScript.
但问题是,可以在下面的条件永远评估为true 在C或C++?
if(a==1 && a==2 && a==3)
printf("SUCCESS");
Run Code Online (Sandbox Code Playgroud)
编辑
如果a是整数.
取决于你对"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;和优化者通常会完全取代支票.
如果a是原始类型(即所有==和&&运算符都是内置的)并且您处于已定义的行为中,并且在执行过程中没有其他线程可以修改a(这在技术上是未定义行为的情况 - 请参阅注释 - 但我把它留在这里因为它是Java问题中给出的例子),并且没有预处理器魔法(参见选择的答案),然后我不相信有任何方法可以评估为真.但是,正如您可以从条件列表中看到的那样,根据所使用的类型和代码的上下文,有许多场景表达式可以评估为true.
如果我们抛开宏观魔法,我可以看到一种可以积极回答这个问题的方法.但它需要的不仅仅是标准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特定的内存部分来实现相同的效果.
| 归档时间: |
|
| 查看次数: |
414 次 |
| 最近记录: |