IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言条件语句中调用函数并赋值时的一个小坑 -> 正文阅读

[C++知识库]C语言条件语句中调用函数并赋值时的一个小坑

在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)
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:43:52  更:2022-03-06 12:47:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:19:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码