首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

c跟指针 操作符

2013-10-22 
c和指针 操作符看书上说如果有表达式1+2+3,编译器可以先计算2+3,再计算1+(2+3)那为啥int a20;if(1a10

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,编译器可以先计算2+3,再计算1+(2+3)

什么书 错这么离谱 1+2+3 必然是 (1+2)+3 没有第二种可能 

书说错 

[解决办法]
引用:
引用
看书上说如果有表达式1+2+3,编译器可以先计算2+3,再计算1+(2+3)

什么书 错这么离谱 1+2+3 必然是 (1+2)+3 没有第二种可能 

书说错 
 人家书我感觉没有错  只不过人家的意思是 1+2+3 是写到程序里的 
编译器如何处理 你就不得而知了例如int a = 1 + 2+ 3;
它的处理过程是在宏替换就处理完的 你没写过编译器 你怎么知道不可以呢先算 1+(2+3)
[解决办法]
引用:
人家书我感觉没有错  只不过人家的意思是 1+2+3 是写到程序里的 
编译器如何处理 你就不得而知了例如int a = 1 + 2+ 3;
它的处理过程是在宏替换就处理完的 你没写过编译器 你怎么知道不可以呢先算 1+(2+3)

有点常识 好不好 1+2+3 和预处理没什么关系 然后 1+2+3 处理为 (1+2)+3是由 优先级结合性决定的 
编译器的实现是必须符合这个要求的
[解决办法]
引用:
《c和指针》上说的

第几版第几页第几章第几段 
[解决办法]
引用:
Quote: 引用:

人家书我感觉没有错  只不过人家的意思是 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个月 但是人总会犯错的 我喜欢承认并解决错误 难道你真的成为了亚里士多德 我看不是吧   
你拿出证据 无证据不要瞎说
[解决办法]
看书上说如果有表达式1+2+3,编译器可以先计算2+3,再计算1+(2+3)

注意红色的字,那是可以,而不是一定或者必然或者肯定....
[解决办法]
引用:
int a;
a = 1 + 2 + 3;
011313BE  mov         dword ptr [a],6  

你敢说这不是预处理做的 那个6是什么  你敢说不是编译器在预处理阶段做的 虽然我才毕业4个月 但是人总会犯错的 我喜欢承认并解决错误 难道你真的成为了亚里士多德 我看不是吧   
你拿出证据 无证据不要瞎说

少年 1+2+3是 编译期常量 编译器把他处理为 6 
不是预处理 预处理做的 #include #if 宏展开 处理折行符 处理注释这些事情
1+2+3 原原本本的提交给编译器 
你看到的是编译器处理的结果 无法说明是预处理器处理的结果 明白吗? 
[解决办法]
引用:
Quote: 引用:

int a;
a = 1 + 2 + 3;


011313BE  mov         dword ptr [a],6  

你敢说这不是预处理做的 那个6是什么  你敢说不是编译器在预处理阶段做的 虽然我才毕业4个月 但是人总会犯错的 我喜欢承认并解决错误 难道你真的成为了亚里士多德 我看不是吧   
你拿出证据 无证据不要瞎说


少年 1+2+3是 编译期常量 编译器把他处理为 6 
不是预处理 预处理做的 #include #if 宏展开 处理折行符 处理注释这些事情
1+2+3 原原本本的提交给编译器 
你看到的是编译器处理的结果 无法说明是预处理器处理的结果 明白吗? 
预处理的实现是编译器的一部分 不是编译器解决的吗 我记得在linux下 直接打gcc -E test.c -o test.i 
这样就可以知道是在哪个阶段处理的 也许是我记错了或许我还没错呢  但是你也不能说人家书错了啊 
[解决办法]
引用:
这样就可以知道是在哪个阶段处理的 也许是我记错了或许我还没错呢  但是你也不能说人家书错了啊 

我说书错 是因为 按照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解释为 1 + (2 + 3) 那么 + 是右结合 
[解决办法]
引用:
预处理的实现是编译器的一部分 不是编译器解决的吗 
我一直说是编译器解决的 
是你说预处理解决的 
就算预处理是编译器的一部分 
那也是预处理完成之后 编译器的其他部分处理 1+2+3

[解决办法]
引用:
Quote: 引用:

这样就可以知道是在哪个阶段处理的 也许是我记错了或许我还没错呢  但是你也不能说人家书错了啊 

我说书错 是因为 按照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,编译器可以先计算2+3,再计算1+(2+3)

注意红色的字,那是可以,而不是一定或者必然或者肯定.... 

编译器的实现 是和它表明告诉人们的标准不一定是重合的  你有点理解偏了 
其实书上的意思是在特定的情况满足下 编辑器会进行适当的优化 而这种优化是你所不能理解的

编译器优化没那么神秘 
这里只是 可以先计算 2 也可以先计算 3
但是 绝对不会 先计算 2+3 
因为 对于这表达式的分析 就不会出现 2+3 这个算子 [子表达式]
不存在的东西 不可能对他进行求值的 
[解决办法]
gcc -E test.c -o test.i

引用:
Quote: 引用:

预处理的实现是编译器的一部分 不是编译器解决的吗 
我一直说是编译器解决的 
是你说预处理解决的 
就算预处理是编译器的一部分 
那也是预处理完成之后 编译器的其他部分处理 1+2+3
gcc -E test.c -o test.i
可以输出test.i文件中存放着test.c经预处理之后的代码。打开test.i文件,看一看,就明白了。
如果我错了 那我错了 我讨论那个没什么意义 试一试就知道了 我感觉我错误的可能性是比较大的 
你赢了 
[解决办法]
引用:
我说书错 是因为 按照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)

注意红色的字,那是可以,而不是一定或者必然或者肯定.... 

编译器的实现 是和它表明告诉人们的标准不一定是重合的  你有点理解偏了 
其实书上的意思是在特定的情况满足下 编辑器会进行适当的优化 而这种优化是你所不能理解的

也许 先计算 2 不好理解 
fooA()+fooB()+fooC()
这个表达式 函数调用的顺序 可能 先调用fooB 在调用fooC
以上

热点排行
Bad Request.