30得票3回答
这是否是在C语言中的未定义行为?如果不是,请逻辑地预测输出。

代码1#include <stdio.h> int f(int *a, int b) { b = b - 1; if(b == 0) return 1; else { *a = *a+1; return *a + f(a, b); } } in...

14得票4回答
序列点和副作用:C11 中的悄然变化?

C99 §6.5 表达式 (1) 表达式是由运算符和操作数组成的序列,用于指定计算值或标识对象或函数,或生成副作用,或执行这些组合中的某种操作。 (2) 在前一个和下一个序列点之间,通过表达式对一个对象的存储值进行修改的次数最多为一次。72) 此外,先前的值只能被读取以确定要...

13得票3回答
手动定义strlen时出现奇怪的行为

我不小心写了下面这个有趣的片段:#include <iostream> #include <cstring> size_t strlen(const char* str) { std::cout << "hello"; return 0; ...

11得票7回答
const_cast的未定义行为

我希望有人能够澄清C++中未定义行为的确切含义。给定以下类定义:class Foo { public: explicit Foo(int Value): m_Int(Value) { } void SetValue(int Value) { m_Int = Value; } ...

11得票2回答
常量值的改变

假设我有一个结构体定义: struct thing { thing* x; int z; thing() : x(this), z(0) {} void foo() const { this->x->z++; } ...

10得票6回答
在C语言中反转一个字符串

我知道这个问题已经被问了成千上万次,但是我就是找不到我的代码中的错误。能否有人友善地指出我做错了什么?#include <stdlib.h> #include <string.h> void reverseString(char *myString){ char ...

26得票7回答
无效指针重新变为有效

int *p; { int x = 0; p = &x; } // p is no longer valid { int x = 0; if (&x == p) { *p = 2; // Is this valid? }...

8得票2回答
一个元组的元素能否引用另一个元素?

更新:请见下面的完整答案。简短的回答是不行,不能直接实现。您可以使用std::reference_wrapper创建间接引用,或者使用指针完成相同的效果(但没有引用的语法糖和额外的安全性)。 我问这个问题是因为元组在C++11中是一个便捷的可变参数存储单元。理论上,让元组的一个元素持有另一个...

9得票1回答
当传递给printf函数的参数不是short/char类型时,使用h或hh长度修饰符是否违法?

printf函数族提供了一系列长度修饰符,其中的两个是hh(表示一个 signed char 或者 unsigned char 类型的参数被升级为int类型)和h(表示一个signed short或者unsigned short类型的参数被升级为int类型)。从历史上看,这些长度修饰符只是为了...

105得票9回答
“未定义行为”是否真的允许发生“任何”事情?

“未定义行为”的典型谬误例子是“鼻涕妖”,这是一种物理不可能性,无论C和C++标准允许什么。 因为C和C++社区往往非常强调未定义行为的不可预测性以及编译器在遇到未定义行为时可以使程序做任何事情的想法,我原以为标准对于未定义行为的行为没有任何限制。 但是,C++标准中的相关引用似乎是: ...