这些C语句之间的区别是什么? int y=17*x; int y=x+16*x; int y=x+(x

这些C语句之间的区别是什么? int y=17*x; int y=x+16*x; int y=x+(x,c,bit-manipulation,C,Bit Manipulation,严格来说,它取决于x的类型和值。就标准而言,溢出带符号的int是未定义的行为,因此,例如,根据代码是否包含2个溢出的操作,或者仅包含1个溢出的操作,允许实现的行为有所不同 假设所有内容都是保持在边界内的整数,则这些语句具有相同的含义。它们可能会产生完全相同的已发出代码,但您必须通过编译器和编译器选项进行检查。优化程度越高,越有可能出现这种情况 同样合理的是,您会看到第一个版本发出一个版本的代码(编译器发出乘法),而另两个版本发出不同的代码(编译器发出加法,乘法16或移位4)。即使没有优化,编译器

严格来说,它取决于
x
的类型和值。就标准而言,溢出带符号的
int
是未定义的行为,因此,例如,根据代码是否包含2个溢出的操作,或者仅包含1个溢出的操作,允许实现的行为有所不同

假设所有内容都是保持在边界内的整数,则这些语句具有相同的含义。它们可能会产生完全相同的已发出代码,但您必须通过编译器和编译器选项进行检查。优化程度越高,越有可能出现这种情况


同样合理的是,您会看到第一个版本发出一个版本的代码(编译器发出乘法),而另两个版本发出不同的代码(编译器发出加法,乘法16或移位4)。即使没有优化,编译器也会计算
1,严格来说,这取决于
x
的类型和值。就标准而言,溢出带符号的
int
是未定义的行为,因此,例如,根据代码是否包含2个运算符,允许实现有不同的行为溢出的,或仅为1

假设所有内容都是保持在边界内的整数,则这些语句具有相同的含义。它们可能会产生完全相同的已发出代码,但您必须通过编译器和编译器选项进行检查。优化程度越高,越有可能出现这种情况

同样合理的是,您会看到第一个版本发出一个版本的代码(编译器发出一个乘法),另外两个版本发出不同的代码(编译器发出一个加法,或者乘以16或移位4)。即使没有优化,编译器也会计算
1
1)int y=17*x;
2) int y=x+16*x;
3) int y=x+(x
1)int y=17*x;
2) int y=x+16*x;

3) int y=x+(x为什么不对它们进行分析并找出答案?哦,最后一个是你真正想要的
x+(xHow是
x
声明的?它有什么值?反汇编代码并进行比较。最后两个可能与大多数编译器在折叠常量表达式方面相当出色的编译器相同。好吧,按位运算总是比其他运算快。为什么不分析它们并找出答案呢?哦,对于最后一个你真正想要的
x+(xHow是
x
声明的?它有什么值?反汇编代码并进行比较。最后两个可能会是相同的,因为大多数编译器在折叠常量表达式方面都非常擅长。哎呀,按位运算总是比其他运算快。@EricPostischil啊,是的,修复了。@EricPostischil啊,是的,修复了。
int y = 17*x;
int y = x + 16*x;
int y = x + (x<<4)
1) int y = 17*x;
2) int y = x + 16*x;
3) int y = x + (x<<4);