c和指针 操作符
看书上说如果有表达式1+2+3,编译器可以先计算2+3,再计算1+(2+3)
那为啥int a=20;
if(1<=a<=10)
。。。
这句话是按顺序判断呢?
[解决办法]
什么书?不一定吧!
[解决办法]
if(a >= 1 && a<= 10)
00F829D5 cmp dword ptr [a],1
00F829D9 jl main+48h (0F829F8h)
00F829DB cmp dword ptr [a],0Ah
00F829DF jg main+48h (0F829F8h)
当然就是顺序了
if(1 <= a <= 10)
000A29D5 cmp dword ptr [a],1
000A29D9 jl main+37h (0A29E7h)
000A29DB mov dword ptr [ebp-0D0h],1
000A29E5 jmp main+41h (0A29F1h)
000A29E7 mov dword ptr [ebp-0D0h],0
000A29F1 cmp dword ptr [ebp-0D0h],0Ah
000A29F8 jg main+61h (0A2A11h)
[解决办法]
int a;
a = 1 + 2 + 3;
011313BE mov dword ptr [a],6
这个1 + 2 + 3 是在宏替换执行的吧 就是一句话 所以它随便算啊
但是你那个比较必须是在运行阶段执行
[解决办法]
人家书我感觉没有错 只不过人家的意思是 1+2+3 是写到程序里的
编译器如何处理 你就不得而知了例如int a = 1 + 2+ 3;
它的处理过程是在宏替换就处理完的 你没写过编译器 你怎么知道不可以呢先算 1+(2+3)
《c和指针》上说的
人家书我感觉没有错 只不过人家的意思是 1+2+3 是写到程序里的
编译器如何处理 你就不得而知了例如int a = 1 + 2+ 3;
它的处理过程是在宏替换就处理完的 你没写过编译器 你怎么知道不可以呢先算 1+(2+3)
有点常识 好不好 1+2+3 和预处理没什么关系 然后 1+2+3 处理为 (1+2)+3是由 优先级结合性决定的
编译器的实现是必须符合这个要求的
int a;
a = 1 + 2 + 3;
011313BE mov dword ptr [a],6
你敢说这不是预处理做的 那个6是什么 你敢说不是编译器在预处理阶段做的 虽然我才毕业4个月 但是人总会犯错的 我喜欢承认并解决错误 难道你真的成为了亚里士多德 我看不是吧
你拿出证据 无证据不要瞎说
int a;
a = 1 + 2 + 3;
011313BE mov dword ptr [a],6
你敢说这不是预处理做的 那个6是什么 你敢说不是编译器在预处理阶段做的 虽然我才毕业4个月 但是人总会犯错的 我喜欢承认并解决错误 难道你真的成为了亚里士多德 我看不是吧
你拿出证据 无证据不要瞎说
少年 1+2+3是 编译期常量 编译器把他处理为 6
不是预处理 预处理做的 #include #if 宏展开 处理折行符 处理注释这些事情
1+2+3 原原本本的提交给编译器
你看到的是编译器处理的结果 无法说明是预处理器处理的结果 明白吗?
这样就可以知道是在哪个阶段处理的 也许是我记错了或许我还没错呢 但是你也不能说人家书错了啊
预处理的实现是编译器的一部分 不是编译器解决的吗
这样就可以知道是在哪个阶段处理的 也许是我记错了或许我还没错呢 但是你也不能说人家书错了啊
我说书错 是因为 按照C标准的要求
1 + 2 + 3 第一个 + 先和操作数结合 (1 + 2) + 3
i = c = d
右结合 最右边的 = 先和操作数结合
i = (c = d)
只能这么解释 没有二义性 没有第二种可能
如果 把 1 + 2 + 3解释为 1 + 2 + 3 那么 + 是右结合
这是这个表达式巧合 求值结果一样
如果是 1 - 2 + 3 根据右结合 变成 1 - (2 + 3) 那就大错特错了
你的理解是有偏差的
你的所谓的结合性 是给程序员规定的
而我们讨论的是编译器优化的问题
正如
1+2+3,编译器可以先计算2+3,再计算1+(2+3)
注意红色的字,那是可以,而不是一定或者必然或者肯定....
编译器的实现 是和它表明告诉人们的标准不一定是重合的 你有点理解偏了
其实书上的意思是在特定的情况满足下 编辑器会进行适当的优化 而这种优化是你所不能理解的
我一直说是编译器解决的
预处理的实现是编译器的一部分 不是编译器解决的吗
是你说预处理解决的
就算预处理是编译器的一部分
那也是预处理完成之后 编译器的其他部分处理 1+2+3
我说书错 是因为 按照C标准的要求
1 + 2 + 3 第一个 + 先和操作数结合 (1 + 2) + 3
i = c = d
右结合 最右边的 = 先和操作数结合
i = (c = d)
只能这么解释 没有二义性 没有第二种可能
如果 把 1 + 2 + 3解释为 1 + 2 + 3 那么 + 是右结合
这是这个表达式巧合 求值结果一样
如果是 1 - 2 + 3 根据右结合 变成 1 - (2 + 3) 那就大错特错了