什么是C中的陷阱表示(某些示例可能有帮助)?这适用于C++吗?
float f=3.5;
int *pi = (int*)&f;
Run Code Online (Sandbox Code Playgroud)sizeof(int) == sizeof(float)do f和*pi具有相同的二进制表示/模式?MSVC怎么样?正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.
在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:
Run Code Online (Sandbox Code Playgroud)unsigned char x = 12; { unsigned char x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?
前提:
C++ 11 Standard将表达式分为三个不相交的值类别:lvalues,xvalues和prvalues(第3.10/1节).此处提供了对哪些值类别的解释.
我正在努力弄清楚不同运营商对其操作数的价值类别的要求是什么.第3.10/1段规定:
[...]每个表达式都属于此分类法中的基本分类之一:lvalue,xvalue或prvalue.表达式的此属性称为其值类别.[注意:第5章中对每个内置运算符的讨论表明了它产生的值的类别以及它所期望的操作数的值类别.例如,内置赋值运算符期望左操作数是左值,右操作数是prvalue并产生左值作为结果.用户定义的运算符是函数,它们期望和产生的值的类别由它们的参数和返回类型决定. - 尾注]
尽管上面的说明声称,第5条并不总是非常清楚运营商的操作数的价值范畴.例如,关于赋值运算符的操作数的值类别(第5.17/1段),这就是所说的:
赋值运算符(=)和复合赋值运算符都是从右到左分组.所有都需要一个可修改的左值作为左操作数,并返回一个左值操作数的左值.如果左操作数是位字段,则所有情况下的结果都是位字段.在所有情况下,在右和左操作数的值计算之后,以及在赋值表达式的值计算之前,对赋值进行排序.对于不确定序列的函数调用,复合赋值的操作是单个评估.[注意:因此,函数调用不应介入左值到右值的转换和与任何单个复合赋值运算符相关的副作用. - 尾注]
合适的操作数怎么样?
整个5.17节中不再出现"rvalue"和"lvalue"字样.虽然第3.10/1段中的注释明确指出内置赋值运算符期望将prvalue作为右操作数,但在第5.17节中没有明确提到.甚至5.17/1的最后一个注释,提到左值到右值的转换,似乎暗示rvalues是以某种方式预期的(否则转换的需要是什么?),但笔记毕竟是非规范性的.
涉及其他运算符的部分,包括乘法运算符和加法运算符,通常对其操作数的值类别保持沉默.我在标准中找不到任何"默认语句",声明如果没有另外指定,内置运算符的操作数是rvalues.因此,问题.
题:
很高兴参考C++ 11标准.
在dll项目中,函数是这样的:
extern "C" __declspec(dllexport) void foo(const wchar_t* a, const wchar_t* b, const wchar_t* c)
Run Code Online (Sandbox Code Playgroud)
在另一个项目中,我将使用foo函数,但我foo在头文件中声明函数
extern "C" __declspec(dllimport) void foo(const wchar_t* a, const wchar_t* b)
Run Code Online (Sandbox Code Playgroud)
我只用两个参数调用它.
结果是成功,我认为这是关于__cdecl电话,但我想知道这是如何以及为什么这样做.
根据这篇文章,不确定的价值是:
3.17.2
1 indeterminate value
either an unspecified value or a trap representation
Run Code Online (Sandbox Code Playgroud)
根据谷歌的说法,不确定性的定义是:
根据thefreedictionary,可确定的是:
根据merriam-webster,确定(在特定的上下文中)是:
因此,常识规定尽管在编译期间不确定值是未知的,但它在运行时是完全可确定的,例如,您总是可以读取占用该内存位置的任何事件.
还是我错了?如果是这样,为什么?
编辑:为了澄清,我发布了与用户试图说服不确定值不确定的用户之间的争论,我非常怀疑.
编辑2:澄清,通过"可确定的"我并不意味着稳定或可用的值,即使它是未初始化的内存的垃圾值,仍然可以确定该垃圾的价值.我的意思是,试图确定这个价值仍会产生一些价值,而不是......没有行动.所以这个值必须来自一些内存,分配为仍然不确定的值的存储,我高度怀疑编译器实际上会使用一个随机数生成器只是为了提出一些任意值.
我正在开发一个程序,该程序使用两个函数 area 和周长来返回正方形的面积和周长。我编写的以下代码正确返回区域,但会为周长生成垃圾值。你能纠正我做错了什么吗?
#include<iostream>
#include<cmath>
using namespace std;
int area(int s)
{
int area = s * s;
return area;
}
double perimeter()
{
int s;
int perimeter = 4 * s;
return perimeter;
}
int main()
{
int s;
cout << "enter the side: "
<< endl;
cin >> s;
cout << "area of square is "
<< area(s) << endl;
cout << "perimeter of square 25. is" << perimeter() << endl;
}
Run Code Online (Sandbox Code Playgroud) 如何知道数组是否在C中初始化?像strlen()这样的函数没有帮助我,因为我不想知道数组是否为空.
如果变量被初始化(i = 0),每次调用函数 func 时它仍然是 1,但是
当 i 未初始化时:
#include <stdio.h>
int funct(void);
int main(void)
{
funct();
funct();
funct();
return 0;
}
int funct(void)
{
int i;
static int j = 0;
i++;
j++;
printf(" i = %d j = %d\n", i, j);
}
Run Code Online (Sandbox Code Playgroud)
输出是
i = 1 j = 1
i = 2 j = 2
i = 3 j = 3
Run Code Online (Sandbox Code Playgroud)
我不明白为什么变量 i 的行为像静态变量!