C语言学习笔记(二十)
admin
2024-03-17 01:01:44
0

C语言学习第二十天。

2.12 运算符优先级与求值次序
如下表,同一行中的各运算符具有相同的优先级,各行间从上往下优先级逐行降低。

运 算符                                      结合性
() [] -> .                                      从左至右
! ~ ++ -- + - * & (type) sizeof     从右至左
* / %                                         从左至右
+ -                                             从左至右
<< >>                                       从左至右
< <= > >=                                 从左至右
== !=                                        从左至右
&                                               从左至右
^                                               从左至右
|                                                从左至右
&&                                            从左至右
||                                               从左至右
?:                                              从右至左
= += -= *= /= %= &=               从右至左
^= |= <<= >>=
,                                                从左至右

位运算符&、^、与|的优先级比运算符==与!=的低。这意味者,位测试表达式,如

    if ((x & MASK) == 0) ...

必须用圆括号括起来才能得到正确的结果。
同大多数语言一样,C语言没有指定同一运算符中多个操作数的计算顺序,例如,在形如

    x = f() + g();

的语句,f()可以在g()之前计算,也可以在g()之后计算。因此,如果函数f或g改变了另一个函数所使用的变量,那么x的结果可能会依赖于这两个函数的计算顺序。为了保证特定的计算顺序,可以把中间结果保存在临时变量中。
类似的,C语言也没有指定函数各参数的求值顺序。因此,下列语句

    printf("%d %d\n", ++n, power(2, n));    /* 错 */

在不同的编译器中可能产生不同的结果,这取决于n的自增运算在power调用之前还是之后执行。解决的办法是把该语句改写成下列形式:

    ++n;
    prinf("%d %d", n, power(2, n));

在任何一种编程语言中,如果代码的执行结果与求值顺序相关,则都是不好的程序设计风格。很自然,由必要了解那些问题需要避免,但是,如果不知道这些问题在各种机器上是如何解决的,就最好不要尝试运用某种特殊的实现方式。

3.1 语句与程序块

在x=0、i++或printf(...)这样的表达式之后加上一个分号(;),它们就变成了语句。例如

    x = 0;
    i++;
    printf(...);

在C语言中,分号是语句结束符。
用一对花括号"{"与"}"把一组声明和语句括在一起就构成了一个符合语句(也叫做程序块),复合语句在语法上等价与单条语句。函数体中被花括号括起来的语句便是明显一例。if、else、while与for之后被花括号括住的多条语句也是类似的例子。(在任何程序块中都可以声明变量)右花括号用于结束程序块,其后不需要分号。

3.2 if-else语句

if-else语句用于条件判定。其语法如下所示:

    if (表达式)
        语句1
    else
        语句2

其中else部分是可选的。该语句执行时,先计算表达式的值,如果其值位真(即表达式的值为非0),则执行语句1;如果其值位假(即表达式的值为0),并且该语句包含else部分,则执行语句2.
因为if-else语句的else部分时可选的,所以在嵌套的if语句中省略它的else部分将导致歧义。如下:

    if (n > 0)
        if (a > b)
            z = a;
        else
            z = b;

else部分与内层的if匹配,我们通过程序的缩进结构也可以看出来。如果这不符合我们的意图,则必须使用花括号强制实现正确的匹配关系:

    if (n > 0) {
        if (a > b)
            z = a;
    } else
        z = b;

歧义性在下面这种情况下尤为有害:

    if (n >= 0)
        for (i = 0; i < n; i++)
            if(s[i] > 0) {
                printf("...");
                return i;
            }
    else    /* 错 */
        printf("error -- n is negative\n");

程序的缩进结构明确地表明了设计意图,但编译器无法获得这一信息,它会将else部分与内层的if配对。这种错误很难发现,因此我们建议在有if语句嵌套的情况下使用花括号。

3.3 else-if语句

在C语言中我们会经常用到下列结构:

    if (表达式)
        语句
    else if (表达式)
        语句
    else if (表达式)
        语句
    else if (表达式)
        语句
    else
        语句

这种if语句序列时编写多路判定最常用的方法。其中的各表达式将被依次求值,一旦某个表达式结果为真,则执行与之相关的语句,并终止整个语句序列的执行。同样,其中各语句既可以时单条语句,也可以时用花括号括住的复合语句。
最后一个else部分用于处理“上述条件均不成立”的情况或默认情况。有时候并不需要针对默认情况执行显式的操作,这种情况下,可以把该结构末尾的

    else
        语句

部分省略掉;该部分也可以用来检查错误,以捕获“不可能” 的条件。
这里通过一个折半查找函数说明三路判定程序的用法。该函数用于判定已排序的数组 v中是否存在某个特定的值x。数组v的元素必须以升序排列。如果v中包含x,则该函数返回x在v中的位置(介于0~n-1之间的一个整数);否则,该函数返回-1。
在折半查找时,首先将输入值x与数组v的中间元素进行比较。如果x小于中间元素的值,则在该数组的前半部分查找;否则,在该数组的后半部分查找。在这两种情况下,下一步都是将x与所选部分的中间元素进行比较。这个过程一直进行下去,直到找到指定的值或查找范围为空。

/* binsearch函数: 在v[0] <= v[1] <= v[2] <=...<=v[n-1]中查找x */
int binsearch1(int x, int v[], int n) {
    int low, high, mid;

    low = 0;
    high = n - 1;
    while (low <= high) {
        mid = (low+high) / 2;
        if (x < v[mid])
            high = mid - 1;
        else if (x > v[mid])
            low = mid + 1;
        else     /* 找到了匹配的值 */
            return mid;
    }
    return -1; /* 没有匹配值 */
}

相关内容

热门资讯

邮储银行行长芦苇兼任公司首席合... 5月26日,邮储银行发布董事会决议公告,邮储银行行长芦苇自2026年5月26日起兼任邮储银行首席合规...
我愿意二次到店吗?小店主理人交... 来源:滚动播报 (来源:上观新闻) 咖啡店主理人可以去餐饮店体验一天,感受烟火气和客流管理;手工...
原创 深... 当政策暖风遇上资产配置需求,深圳楼市正上演一场“热度与信心齐飞”的戏码!上周(5.18-5.24),...
被封千万网红大蓝卷土重来:拉人... 蓝鲸新闻5月26日讯(记者 赵凯)“朋友圈散布经济恐慌言论制造焦虑,拉人头设多级返利,数百人入局、累...
抖音商城618前六日数据:消费... “清凉经济”热度高:抖音商城618首阶段空气循环扇订单量同比增长348% 作者 I 钱游 报道 I ...
金华有闲置贵金属想变现该怎么挑... 当下闲置物品处置、短期资金周转的需求日渐普遍,市面上的相关服务机构水平参差不齐,不少有黄金回收需求的...
千亿市值芯片企业完成IPO辅导... 【大河财立方消息】5月26日,新三板挂牌企业宸芯科技股份有限公司(证券简称:宸芯科技)公告,收到青岛...
NBBOSS R1全球首发 重... 5月26日,信人智能旗下全球首款企业家专属AI决策伙伴NBBOSS AI决策机器人R1正式全球首发。...
NFC果汁配料表“水”排第一?... 随着气温升高,果汁进入消费旺季。然而很多果汁产品的标注却让消费者感到困惑。比如:有的标注“纯果汁”,...
存储牛市与全民狂热:韩国股市泡... 2026年5月的韩国,正经历一场史无前例的资本狂欢。自2025年4月触底以来,KOSPI指数在18个...
下架,召回!双汇子公司猪肉抗生... 近日,黑龙江省市场监督管理局网站发布关于食品安全监督抽检信息的通告(2026年第7期)。 其中,望奎...
换帅潮席卷白酒圈 白酒本轮人事变动频次之高、画像之多元,几乎超过了过去任何一个周期。 5月19日,“河北王”老白干酒宣...
4月意大利起泡酒猛增122.5... 近日,海关总署公布了2026年4月葡萄酒进口数据。其中,起泡酒表现尤为突出,进口量同比增长35.8%...
华为“韬定律”提振港股半导体股... 财联社5月26日讯(编辑 胡家荣)半导体产业链个股集体走强。截至发稿,华虹半导体(01347.HK)...
历史不会重演,但会惊人相似:中... 金价疯涨别乱买!复刻2015年走势,普通人记住3个保命妙招 最近逛商场,最大的感受就是黄金柜台太热闹...
商品标签被指涉嫌性暗示,盒马道... 近日,盒马旗下一款粉木耳产品因标签设计引发争议,不少网友吐槽该商品标签低俗,涉嫌性暗示。 25日晚...
东莞一上市公司董事会“换血”,... 近日,易事特集团股份有限公司发布《关于董事会完成换届选举及聘任高级管理人员、证券事务代表暨公司控制权...
做宠物食品,已经很难赚到钱了? 流量争夺战里没有赢家 撰文/ 黎炫岐 编辑/ 李觐麟 排版/ Annalee “它经济”,一个持续升...
2万亿美元!SpaceX上市前... “你想在早上醒来时觉得未来会很美好——而这正是成为太空文明的全部意义所在。它关乎相信未来,并认为未来...