#include <stdio.h>
#define Alphabet 26
struct Data
{
int iNum;
};
int main()
{
#if 0
int iNum = 0;
while(1)
{
iNum = (iNum++ % Alphabet);
printf("%d\n",iNum);
}
#else
Data data = {0};
while(1)
{
data.iNum = (data.iNum++ % Alphabet);
printf("%d\n",data.iNum);
}
#endif
return 0;
}
在#if
分支中打印1-26
;但是在#else
分支中打印1,2,3,...
。这可能是因为add
和lea
汇编指令有关,但是为什么要使用不同的指令?我不太清楚。
那么,是否必须防止以这种方式编码?喜欢iNum = (iNum++ % Alphabet)
。
您的第二个示例是未定义的行为。同一对象(data.iNum)被修改两次,而无需插入顺序点。可能发生任何事情,包括您的应用程序崩溃,包括仅当您将其交付给付费客户时才崩溃,该客户将向您起诉数百万美元。
PS。不,相同的表达式不会产生不同的结果。具有非常小的相似性的两个非常不同的表达式产生了不同的结果。由于在具有ARM处理器的计算机上运行代码时也会发生同样的情况,因此它与汇编指令无关。组装说明根本不涉及。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句