以下代码在 C 语言中有效/良好实践吗?
int x = 1;
printf(x == 1 ? "%d second elapsed" : "%d seconds elapsed", x);
Run Code Online (Sandbox Code Playgroud)
它编译得很好,所以我认为它很好(也因为它只是 if-else 块的语法糖),但如果有人有一些额外的见解,我将不胜感激,谢谢。
PS,我想 C++ 也是如此?
我看过类似的问题,但似乎找不到我的代码有什么问题。
我正在尝试在 MacOS 上进行“write”系统调用以将字符串打印到标准输出。
我能够printf完美地做到这一点,并且熟悉在 x64 汇编中调用其他函数。
然而,这是我第一次尝试syscall。
我正在使用 GCC 的 GAS 汇编器。
这是我的代码:
.section __TEXT,__text
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq $0x20000004, %rax
movq $1, %rdi
leaq syscall_str(%rip), %rsi
movq $25, %rdx
syscall
jc error
xorq %rax, %rax
leave
ret
error:
movq $1, %rax
leave
ret
.section __DATA,__data
syscall_str:
.asciz "Printed with a syscall.\n"
Run Code Online (Sandbox Code Playgroud)
看起来没有任何错误;根本没有写入任何内容stdout。
我知道它start通常用作 MacOS 上可执行文件的起点,但它不能使用 GCC 进行编译。
在以下场景中,operator<<函数参与重载解析(当它位于全局命名空间中时):
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec) {
os << '[';
for (const T &val : vec)
os << val << ", ";
return os << "\b\b]";
}
Run Code Online (Sandbox Code Playgroud)
...但是下面,当在名称空间内定义时,它不会:
namespace blah {
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec) {
os << '[';
for (const T &val : vec)
os << val << ", ";
return os << "\b\b]";
}
}
Run Code Online (Sandbox Code Playgroud)
当从 调用时main,如下所示:
int main() {
std::vector<int> vec{5, 4, 3, 6, …Run Code Online (Sandbox Code Playgroud) c++ namespaces operator-overloading overload-resolution name-lookup