在IF语句中读写变量
Read and write variable in an IF statement
我希望在单个IF语句中执行以下步骤,以节省代码编写:
如果ret
为TRUE
,则设置ret
为功能lookup()
的结果。如果ret
现在是FALSE
,打印错误信息
BOOLEAN ret = TRUE;
// ... functions assigning to `ret`
if ( ret && !(ret = lookup()) )
{
fprintf(stderr, "Error in lookup()n");
}
我有一种感觉,这并不像看起来那么简单。从IF语句中的同一变量中读取、赋值并再次从该变量中读取。据我所知,编译器总是会根据优先级将这样的语句拆分为它们的组成操作,并一次计算一个连接符,当计算一个操作数为false时立即失败,而不是全部计算。如果是这样,那么我希望代码遵循我上面写的步骤。
我在IF语句中使用了很多赋值,我知道它们是有效的,但没有事先阅读。
为什么这不是好的代码?就我个人而言,我认为这很容易阅读,意思很清楚,我只是担心编译器可能不会产生等效的逻辑,不管什么原因。也许编译器供应商的差异,优化或平台依赖性可能是一个问题,尽管我对此表示怀疑。
...to save on code writing
这几乎从来不是一个有效的参数。不要这样做。特别是,不要为了"节省输入"而将代码混淆成一个有bug的、不可读的混乱。这是一个非常糟糕的程序。
我有一种感觉,这并不像看起来那么简单。从IF语句中的同一变量中读取、赋值和再次读取。
正确的。这与if语句本身没有什么关系,而是与所涉及的操作符有关。
据我所知,编译器总是会根据优先级将这样的语句拆分为它们的组成操作,并一次计算一个连词
嗯,是的…但是有运算符优先级和子表达式的求值顺序,它们是不同的东西。为了使事情更加复杂,有序列点。
如果你不知道操作符优先级和求值顺序之间的区别,或者你不知道序列点是什么,你需要立即停止在一行中填充尽可能多的操作符,因为在这种情况下,你将会到处写可怕的错误。
在你的特殊情况下,你可以避免错误的编程,因为作为一个特殊情况,恰好在&&的左值和右值之间有一个序列点。操作符。如果您使用不同的操作符(例如ret + !(ret = lookup()
)编写了类似的混乱代码,则代码将具有未定义的行为。一个需要数小时、数天或数周才能找到的bug。好吧,至少你节省了10秒钟的打字时间!
同样,在C和c++中都使用标准的bool
类型,而不是一些自制的版本。
你需要把你的代码修改成更容易读和更安全的东西:
bool ret = true;
if(ret)
{
ret = lookup();
}
if(!ret)
{
fprintf(stderr, "Error in lookup()n");
}
为什么这不是好的代码?
是的,这种肮脏的代码片段有很多问题!
1)没有人能读懂它,它也无法维护。许多编码指南都包含这样一条规则:"每行一条语句"。
2)如果在一个if
语句中组合了多个表达式,在定义表达式之前,只执行第一个语句!这意味着:如果你有多个表达式与AND
相结合,第一个生成false的表达式将是最后一个执行的表达式。与OR
组合相同:第一个计算为true
的是最后一个执行的。你已经写过了,还有你!知道这个,但这是一个有点棘手的编程。如果你所有的学院都这样写代码,也许没问题,但据我所知,我的同事们在第一步不会理解你在做什么!
3)永远不要在一个语句中比较和赋值。它简直太丑了!
4)如果你!已经在想"我只是担心编译器可能不会产生等效的逻辑",你应该再想想为什么你不确定你在做什么!我相信每个必须使用这种肮脏代码的人都会重新考虑这种组合。
提示:不要那样做!从来没有!
- 用C++快速读写文件
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 在一个读写器队列中,我可以用volatile替换原子吗
- C++套接字对不读/写父/子
- 如何调试读写器锁的死锁?
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- Linux 挂载使用重新挂载以允许读写
- C++中读/写二进制文件
- 如何读/写或遍历 std::array 中的特定元素范围?
- 内存排序或读取-修改-写入操作,仅(读/写)内存顺序
- USB-HID 读/写(重叠)等待单个对象不返回C++
- 为什么使用_access时只读测试对读写文件有效
- Boost::Asio串行读/写打开:参数不正确
- 读/写 OpenMP 中的共享向量会减慢程序速度
- 对 std::atomic 变量的更改(读/写)如何在线程之间传播
- C++-全局变量与局部变量的读/写速度
- 读/写void*变量的单个字节
- 具有条件变量的读写器锁
- 在IF语句中读写变量