概述
问题源于论坛的一道题目:
http://topic.csdn.net/u/20100216/21/ec98464e-a47e-4263-bb1c-a001e130ba87.html
下面是问题:
设int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)+=123; printf("%d,%d",*ptr,*(++ptr)); 答案为什么是:8,8
问题的焦点也落在printf执行的问题上,到底先执行谁,后执行谁, 还有部分有才青年将该问题中庸化,觉得跟编译器有关。
执行的顺序真的跟编译器有关吗? 后面再讨论这个问题。
printf执行的问题, 完全可以归结函数执行顺序的通用问题, 所以,用例子来将该问题抽象化:
#include <stdio.h> int left() { printf("left /n"); return 0; } int right() { printf("right /n"); return 0; } int myFunction(int a, int b) { return 0; } int main() { myFunction(left(),right()); }
执行的结果是:
right
left
从中可以看出来, 括号中(理解为函数即可), 执行的顺序是先从右边,再从左边。
现在,再考虑编译器的影响, 我们说的编译器不是你自家开发的编译器, 这个世界上总有些BT的机构, 可能也会开发一个编译器,可能也搞些非常BT的功能(类似于咱移动喜欢将别人好好的WIFI给阉割了), 我们不讨论BT的个案。
ANSI C的标准中,一条不成文的规定是, 目标参数往往作为第一个参数, 类似于strcpy(dst, src). 这个规定,主流的编译器都认同这样一条规则, 在操纵目标之前, 必定先要将源好好处理一把, 所以, 函数中,也就是括号中,确定的优先级,是从最右边,也就是从src源开始处理,处理完后,再进一步处理dst的。
这样的设计,既符合ANSI C的约定, 也符合处理常识。
如果真的有编译器不按照这条路走的, 崩溃的不是程序,而是Coder.
最后
以上就是贪玩金毛为你收集整理的C中括号优先级的思考的全部内容,希望文章能够帮你解决C中括号优先级的思考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复