首页 > 其他分享 >C语言条件语句中调用函数并赋值时的一个小坑

C语言条件语句中调用函数并赋值时的一个小坑

时间:2022-12-06 23:44:38浏览次数:34  
标签:count 10 read len C语言 调用函数 str buf 小坑

在C语言中,如果在条件语句中赋值,一定要注意符号优先级的问题,比较符号是比赋值符号先执行的。如果同时还调用函数,并将返回值赋给变量,更容易产生错误。

看下面的代码:

int increase(int a) {
    return a + 1;
}

int main(int argc, char* argv[]) {
    int count = 0;
    while (count = func(count) < 10) {
        // ...
    }
    return 0;
}

我希望循环执行10次。但这段代码会陷入死循环。这是因为语句

while (count = func() < 10)

是先调用func(count),将其返回值与10比较,然后将比较的结果赋值给count。由于count原始值为1,所以func(count)返回值为22 < 10是真,从而count新赋值后为1。之后,count的值在每次循环都是1,因此无法退出循环。

正确的写法,要么是加上括号:

while ((count = func(count)) < 10) {
    // ...
}

但我个人认为这样写不是很好看,所以我更愿意写成:

do {
    count = func(count);
    // ...
} while (count < 10);

类似的情形是从TCP套接字中读取数据时:

while (str_len = read(client_sock, buf, BUF_SIZE) != 0) {
    buf[str_len] = 0;
    printf("Message from client: %s\n", buf);
}

假设客户端发送了字符串hello,并已经全部到达本机的套接字缓冲区。第一次循环时,由于read()返回值大于0,所以str_len值为1,只会在屏幕打印h

由于str_len1,所以会开始第二次循环,但实际上之前已经读到所有字符并存到buf数组,只是在错误的地方加上了字符串结束符。此时套接字缓冲区已经为空,所以程序会在read()函数处阻塞。

注意,缓冲区为空并不会使read()返回0,只有读取到客户端发送的EOF(客户端关闭套接字时发送)才会使read()返回0

正确的写法:

do {
    str_len = read(client_sock, buf, BUF_SIZE);
    buf[str_len] = 0;
    printf("Message from client: %s\n", buf);
} while (str_len != 0)

标签:count,10,read,len,C语言,调用函数,str,buf,小坑
From: https://www.cnblogs.com/midoq/p/16961813.html

相关文章

  • C语言中的强符号和弱符号
    摘自:https://blog.csdn.net/ASJBFJSB/article/details/81267934一、强弱符号强弱符号针对的是处于同一工程下在不同源文件下定义的全局变量符号,链接器只处理global的符号......
  • 喝汽水--C语言
    题目名称:喝汽水问题题目内容:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程)分析:1.20元能喝20瓶2.2个空瓶能换1瓶汽水,剩下的空瓶:empty/2+empty%代码方法1:#inc......
  • 二叉树入门到进阶(下一篇讲红黑树)——c语言刷题合集
    目录二叉树概念二叉树的遍历方式DFS(前序中序后序遍历)144.二叉树的前序遍历递归解法迭代解法94.二叉树的中序遍历145.二叉树的后序遍历层序遍历--队列的作用102.二叉......
  • C语言学习入门 (八) 结构体和枚举
    结构体它允许内部的元素是不同类型的结构体的定义//结构体类型:struct{charintfloat};//定义一个结构体变量,定义变量时才分配存储空间structPersonstructchar *name;int}......
  • C语言学习入门 (二) 语句和运算符
    C语言的基本语句跟Java中的差不多循环语句(dowhile、while、for)条件语句(if 、if-else、switch)goto语句 (比如在循环外定义一个标记Exit:; 在循环内可以用gotoExit;......
  • c语言实现乘法口诀
    #include<stdio.h>intmain(void){inti,j;for(j=1;j<10;j++)for(i=1;i<10;i++){if(i<j){if((i==2)......
  • 单片机C语言C51的语句
    1. if语句if语句是C51中的一个基本条件选择语句,它通常有三种格式:(1)if(表达式){语句;}(2)if(表达式){语句1;} else {语句2;}(3)if(表达式1){语句1;}else if(表达式2)(语句2;)else......
  • 数据结构(C语言版)
    数据结构(C语言版)作者:李云清 杨庆红 揭安全出版社:人民邮电出版社 一、概论1.1数据结构的基本概念与术语1.2数据类型和抽象数据类型1.3算法和算法分析1.4......
  • C语言第二课学习笔记--运算符,流程控制和函数
    <7>运算符1)分类:一些基本的运算符分类有:算术、关系、逻辑、赋值算术运算符有:+,-,*,/,%;    对于/被除数和除数都是int则结果是int,有一个是float结果就是float;对于%,被......
  • C语言从入门到实战(基础学习篇)
    1.基本数据类型原码反码和补码正数的反码是其本身负数的反码是在其源码的基础上,符号位不变,其余各个位取反负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+11.......