以下 C/C++ 代码是否调用未定义的行为
Does the following C/C++ code invoke undefined behavior?
int a = 2, b = 3, c = 4, d = 5;
a > 1 ? b : c = d;
我的一位朋友告诉我,这引发了未定义的行为,我觉得恰恰相反。谁能帮我?
如果写运算符像
( a > 1 ? b : c ) = d;
(因为以这种方式在 C 中解析(那么它在 C++ 中有效,但不会在 C 中编译,因为在 C 中运算符返回 rvalue。
如果要删除括号,那么在C++中它将等效于
a > 1 ? b : ( c = d );
因此,运算符在 C 和 C++ 中的行为不同。在 C 记录中
a > 1 ? b : c = d;
相当于
( a > 1 ? b : c ) = d;
并且不会被编译。
在C++记录中
a > 1 ? b : c = d;
等效于TP
a > 1 ? b : ( c = d );
并将被编译。
此外,如果以与在 C 中解析相同的方式用 C++ 重写它
( a > 1 ? b : c ) = d;
然后再次编译它,因为 C++ 中的运算符返回 lvalue。
这是 C 中运算符的定义
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
这是运算符在C++
的定义conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
如您所见,除了语义差异之外,运算符的语法相对于第三个表达式也存在差异。
此代码不会调用未定义的行为,但会在 C 中产生一些错误,因为a > 1 ? b : c = d;
将被计算为
(a > 1 ? b : c) = d;
a > 1 ? b : c
将导致右值不能是赋值运算符 =
的左操作数。
相关文章:
- 从python调用openMP共享库时,未定义opnMP函数
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 调用 Win32 API 函数时未定义的引用
- C++:对函子重载调用运算符的未定义引用
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 使用 %s 调用 printf 并传递零长度的字符*是未定义的行为吗?
- 调用提取重加载器会产生对"运算符"的未定义引用错误>>
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 从用户定义的头文件调用函数时出现未定义的引用错误,其实现位于.cpp文件中
- 在 C++ 中调用时对内联程序集代码的未定义引用
- C++调用lua_dostring来加载具有"require('cjson')"的Lua Scrip引发错误:cjson.so:未定义的符号:lua_getfield
- C++程序调用 C 函数 在 g++ 链接期间获取未定义的引用
- 调用函数时未定义标识符"function_name"
- 为什么 std::move 未定义,尽管编译器使用 -std=c++11 调用
- 未定义对调用堆栈库的引用出现问题
- 未定义的对通过静态库中调用的同一文件中定义的函数的引用
- 如何从uint8_t的缓冲区读取带符号整数,而不调用未定义或实现定义的行为
- 已经或将要使用C++14或C++1z使其不再未定义调用委托类成员函数指针