cpp►endl与‘\n‘的区别?

本文讨论了在C++编程中使用std::endl与' '的区别。std::endl不仅换行,还会刷新输出,可能导致性能下降。建议使用' '来替换std::endl,以减少不必要的刷新操作,提升程序运行效率。示例代码展示了如何在实际输出中应用' '。

使用std::endl可能有点低效,因为它实际上执行两个任务:它将光标移到下一行,并“刷新”输出(确保它立即显示在屏幕上)。 当使用std::cout向控制台写入文本时,std::cout通常会刷新输出(如果不刷新,通常也没有关系),所以有std::endl刷新并不重要。
因此,通常首选使用’ \n '字符。 ’ \n ‘字符将光标移到下一行,但不执行冗余刷新,因此性能更好。 字符’ \n '也更容易阅读,因为它更短,可以嵌入到现有的文本中。

#include <iostream> // for std::cout
int main() {
    int x{ 5 };
    std::cout << "x is equal to: " << x << '\n'; // Using '\n' standalone
    std::cout << "And that's all, folks!\n"; // Using '\n' embedded into a double-quoted piece of text (note: no single quotes when used this way)
    return 0;
}
x is equal to: 5
And that's all, folks!
/* * Copyright : Cookoo Science, All Rights Reserved ©2022 * * cookoo_pin.cpp * * Author cookoo */ #include <iostream> #include <string> #include "cookoo_sdk.h" using namespace cookoo; int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s [options]\n", argv[0]); printf(" Eg.: %s GET_IO 3\n", argv[0]); printf(" Eg.: %s SET_IO 3 1\n", argv[0]); printf(" Eg.: %s GET_ADC 1\n", argv[0]); printf(" Eg.: %s GET_DC 2\n", argv[0]); printf(" Eg.: %s SET_DC 0 1 (0==DC1, 1==DC2, 2==SBUS)\n", argv[0]); return -1; } std::string op(argv[1]); if (op == "GET_IO") { if (argc < 3) { printf("Usage: %s GET_IO [PIN]\n", argv[0]); return -1; } uint8_t pin_num = atoi(argv[2]); cookoo::Ck_Pin pin; bool gpio_stat = pin.Get((cookoo::Ck_Pin::CK_PIN)pin_num); std::cout << "GPIO-" << (int)pin_num << ": " << gpio_stat << std::endl; } else if (op == "SET_IO") { if (argc < 4) { printf("Usage: %s SET_IO [PIN] [VAL]\n", argv[0]); return -1; } uint8_t pin_num = atoi(argv[2]); uint8_t val = atoi(argv[3]); cookoo::Ck_Pin pin; bool gpio_set = pin.Set((cookoo::Ck_Pin::CK_PIN)pin_num, val); } else if (op == "GET_ADC") { if (argc < 3) { printf("Usage: %s GET_ADC [ADC_CH]\n", argv[0]); return -1; } uint8_t pin_num = atoi(argv[2]); cookoo::Ck_Pin pin; float adc_stat = pin.Get((cookoo::Ck_Pin::CK_AD)pin_num); std::cout << "ADC-" << (int)pin_num << ": " << adc_stat << " V" << std::endl; } else if(op =="GET_DC") { if (argc < 3) { printf("Usage: %s GET_DC [DC_CH]\n", argv[0]); return -1; } uint8_t pin_num = atoi(argv[2]); cookoo::Ck_Pin pin; float dc_stat = pin.Get((cookoo::Ck_Pin::CK_DC)pin_num); std::cout << "GET_DC:" << dc_stat << std::endl; } else if (op == "SET_DC") { if (argc < 3) { printf("Usage: %s SET_ADC\n", argv[0]); return -1; } uint8_t pin_num = atoi(argv[2]); uint8_t val = atoi(argv[3]); cookoo::Ck_Pin pin; bool dc_stat = pin.Set((cookoo::Ck_Pin::CK_DC)pin_num, val); std::cout << "DC-" << (int)pin_num << ": " << dc_stat<< " V" << std::endl; } else if(op == "SET_DEVICE") { if (argc < 2) { printf("Usage: %s SET_DEVICE\n", argv[0]); return -1; } uint8_t pin_num = atoi(argv[2]); printf("Usage pin_num: %d SET_DEVICE\n", pin_num); cookoo::Ck_Pin pin; pin.SetDevice((cookoo::Ck_Pin::DEVICE_IO)pin_num); } else { printf("Usage: %s [options]\n", argv[0]); printf(" Eg.: %s GET_IO 3\n", argv[0]); printf(" Eg.: %s SET_IO 3 1\n", argv[0]); printf(" Eg.: %s GET_ADC 1\n", argv[0]); printf(" Eg.: %s GET_DC 2\n", argv[0]); printf(" Eg.: %s SET_DC 1 0\n", argv[0]); } return 0; } 上文代码中argv[0]和argv[1]分别有什么作用
10-31
C++ 中,`::` 是 **作用域解析运算符(Scope Resolution Operator)**,用于访问特定作用域中的成员,比如类的静态成员、命名空间中的变量或函数、基类的成员等。 --- ## ✅ `::` 的主要作用 ### 1. **访问类的静态成员** 静态成员属于类本身,而不是类的实例。 ```cpp class MyClass { public: static int count; }; int MyClass::count = 0; // 必须在类外定义静态成员 int main() { MyClass obj; MyClass::count = 10; // 使用 :: 访问静态成员 return 0; } ``` --- ### 2. **调用类的静态函数** 静态函数可以直接访问静态成员,不能访问非静态成员。 ```cpp class MyClass { public: static void show() { std::cout << "Static function" << std::endl; } }; int main() { MyClass::show(); // 不需要对象即可调用 return 0; } ``` --- ### 3. **访问命名空间中的变量或函数** 命名空间用于避免命名冲突。 ```cpp namespace MyNamespace { int value = 42; void print() { std::cout << "Hello from MyNamespace" << std::endl; } } int main() { std::cout << MyNamespace::value << std::endl; MyNamespace::print(); return 0; } ``` --- ### 4. **访问基类的成员(防止重写)** 当派生类重写了基类的函数,想调用基类的实现时,可以用 `::`。 ```cpp class Base { public: virtual void show() { std::cout << "Base show" << std::endl; } }; class Derived : public Base { public: void show() override { Base::show(); // 调用基类的 show std::cout << "Derived show" << std::endl; } }; ``` --- ### 5. **全局作用域访问** 如果局部变量和全局变量同名,可以通过 `::` 显式访问全局变量。 ```cpp int value = 100; int main() { int value = 10; std::cout << "Local value: " << value << std::endl; std::cout << "Global value: " << ::value << std::endl; return 0; } ``` --- ## ✅ 总结表格 | 用法 | 示例 | 说明 | |------|------|------| | 类静态成员 | `MyClass::count` | 访问类的静态成员 | | 类静态函数 | `MyClass::show()` | 调用类的静态函数 | | 命名空间成员 | `MyNamespace::print()` | 访问命名空间中的函数或变量 | | 基类成员 | `Base::show()` | 显式调用基类的函数 | | 全局变量 | `::value` | 访问全局作用域的变量 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzyjr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值