我是靠谱客的博主 贪玩金毛,最近开发中收集的这篇文章主要介绍C中括号优先级的思考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题源于论坛的一道题目:

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中括号优先级的思考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部