精华内容
下载资源
问答
  • warning C4293: “>>”: Shift 计数为负或过大,其行为未定义  并且运算结果为0。 所以当位运算的移动位数是变量的时候,要对移动位数做是否 >=0 的判断。不然结果可能和预想的不一样(多么痛的领悟)。
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int a =32,b = 32;
    	cout << "(a >>-1 ) = "<<( a >> -1 ) << endl;
    	cout << "(b >>-1 ) = "<<( b >> -1 ) << endl;
    	return 0;
    }

     

    c++ 位运算 左移右移 需要注意,当移动位数为负数时,会有警告

    warning C4293: “>>”: Shift 计数为负或过大,其行为未定义

     并且运算结果为0。

    所以当位运算的移动位数是变量的时候,要对移动位数做是否  >=0  的判断。不然结果可能和预想的不一样(多么痛的领悟)。

    展开全文
  • 如果两段内存重叠,用memcpy函数可能会导致行为未定义,改进: void* memmove(void* str1,const void* str2,size_t n) { char* pStr1= (char*) str1; const char* pStr2=(const char*)str2; if (pStr1 ) { ...

    如果两段内存重叠,用memcpy函数可能会导致行为未定义,改进:

    void* memmove(void* str1,const void* str2,size_t n)
    {
    	char* pStr1= (char*) str1;
    	const char* pStr2=(const char*)str2;
    	if  (pStr1 < pStr2 ) 
    	{
    		for(size_t i=0;i!=n;++i)
    		{
    			*(pStr1++)=*(pStr2++);
    		}
    	}
    	else
    	{
    		pStr1+=n-1;
    		pStr2+=n-1;
    		for(size_t i=0;i!=n;++i)
    		{
    			*(pStr1--)=*(pStr2--);
    		}
    	}
    	return (str1);
    }
    int main()
    {
    	// 内存重叠
    	char c1[] = "hello world";
    	memmove(c1+3, c1, 8);
    	cout<<"memmove result:   "<<c1<<endl; //输出结果:helhello wo
    
    	memcpy(c1+3,c1,8);
    	//cout<<"memcpy:   "<<c1<<endl;  // <span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">输出</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">结果:</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">helhelhell0</span>
    
    	// 内存不重叠
    	char c2[] = "hello world";
    	char c3[] = "love you";
    	memmove(c2,c3,8);
    	//cout<<"memmove result:"<<c2<<endl;//<span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">输出结果:</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">love yourld</span>
    
    	memcpy(c2,c3,8);
    	cout<<"memcpy:   "<<c2<<endl; //输出结果:love yourld
    
    	memcpy(c1+3,c1,8);
    
    }


    展开全文
  • c / c++ 编程当中会遇到一些未定义行为 这些行为多数和c/c++标准当中的定义不明确有关系 第一种,操作数的执行顺序 标准当中,只有四个操作数有过明确的执行顺序: 逻辑运算符&&和|| 从左到右,...

    c / c++ 编程当中会遇到一些未定义的行为

    这些行为多数和c/c++标准当中的定义不明确有关系

    第一种,操作数的执行顺序

    标准当中,只有四个操作数有过明确的执行顺序:

          逻辑运算符&&和||   从左到右,短路测试

          ?:条件运算符  先执行?前面的表达式

           逗号运算符,从左到右

    其他的运算符,都没有定义执行顺序,也就是说  v = f1()+f2()这个表达式,f1()和f2()谁先执行是未定义的

    例如:  v = (++i )/ (--i) ; 

                  v = a[++i][++i];      没有定义两个[]里面的表达式的先后执行顺序

     

    二. 多参数的函数

       多参数函数,比如func(par1, par2) 

       当par1和par2是两个表达式的时候,par1和par2谁先执行是没有定义的

       当然,执行的结果,是右侧的参数先入栈,左侧的后入栈,这是有明确定义的

       printf("%d %d",  ++i, ++i);

     

    三 涉及到中间变量的行为

    典型的就是i++这种

    比如: i = i++;

    i++ 先返回i的值,再自增。 但是这里并没有定义这个自增后对自身复制的先后顺序

    i = ++i 就没有这个问题

     

    四 其他情况,待整理

    前面三种都是未定义顺序的行为, 其他的未定义的行为肯定还有,有待进一步的搜集整理分类:

        比如long到底是多少位的,在不同的操作系统和编译器也不一样,可能归咎于编译器的行为更贴切

     

     

    展开全文
  • 对于未定义行为,C++标准没有明确规定编译器们应该怎么做,那么执行的结果就是不可预料的。下面我们来详细探讨下
  • int左移32位的行为未定义 Coverity 代码静态安全检测 Is Shifting more than 32 bits of a uint64_t integer on an x86 machine Undefined Behavior?   uint64_t s = 1 &lt;&lt; 32; uint64_t s = 1ULL ...

    int左移32位的行为未定义

    Coverity 代码静态安全检测

    Is Shifting more than 32 bits of a uint64_t integer on an x86 machine Undefined Behavior?

     

    uint64_t s = 1 << 32;
    
    uint64_t s = 1ULL << 32;
    
    Note, however, that if you write a literal that fits into 32 bits, e.g. uint64_t s = 1 << 32 as surmised by @drhirsch, 
    you don't actually shift a 64-bit value but a 32-bit one. That is undefined behaviour. The most common results are a
    shift by shift_distance % 32 or 0, depending on what the hardware does.

     

    展开全文
  • C语言的未定义行为(undefined behaviour)

    万次阅读 多人点赞 2016-05-15 11:21:03
    什么是未定义行为简单地说,未定义行为是指C语言标准未做规定的行为。编译器可能不会报错,但是这些行为编译器会自行处理,所以不同的编译器会出现不同的结果,什么都有可能发生,这是一个极大的隐患,所以我们应该...
  • C语言中的未定义行为

    千次阅读 2015-08-10 22:41:59
    C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用...
  • C语言未定义行为

    千次阅读 2018-04-08 16:58:16
    写在前面的话: ...感谢博主,是真的结合自己的感受写出来的,而且练习题哈哈哈和我遇上的也...简单地说,未定义行为是指C语言标准未做规定的行为。编译器可能不会报错,但是这些行为编译器会自行处理,所以不同的编译...
  • 在一些程序语言中,在某些情况下存在着一些未定义行为,其中以C和C++最为著名,在C++中,规定某些操作的行为未定义的。这些未定义行为往往会导致一些程序的错误问题的出现,作为一名合格的程序员,应该极力避免...
  • 导致C++中产生未定义行为

    千次阅读 2019-03-12 21:24:48
    1、位运算: ...因此会产生未定义行为。 关于符号位如何处理C++标准没有明确规定,所以强烈建议将位运算用于处理无符号类型。因此,在使用位运算的过程中,因尽量将对象声明为无符号的,如:un...
  • C++中的未定义行为

    2021-01-20 03:35:01
    现在我们需要一个程序从控制台读入一个 INT 型整数(输入确保是INT),然后输出...好了,欢迎走进未定义行为 (Undefined Behavior) 的世界。  什么是未定义行为  文章一开始的程序中用到了 abs 求值函数,当n为
  • C/C++中的未定义行为

    千次阅读 2019-06-28 21:20:18
    文章目录未定义行为(Undefined Behavior)C和C++的未定义行为的一些例子尝试修改字符串字面量会产生未定义行为除以零会导致未定义行为某些指针操作可能导致未定义行为到达返回数值的函数(除main函数以外)的结尾,...
  • 什么叫做未定义行为

    2019-08-24 09:51:37
    一、未定义行为 C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。 同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,...
  • 未定义行为

    千次阅读 2013-12-12 20:09:25
     不幸的是,含有未定义行为的程序在有些环境或编译器中可以正确执行,但并不能保证同一程序在不同编译器中甚至在当前编译器的后继版本中会继续正确运行,也不能保证程序在一组输入上可以正确运行且在另一组输入上也...
  • C++ 中的未定义行为

    2016-09-18 23:19:26
    如此众多的未定义行为,无疑给我们带来了许多麻烦,下面我们将列出一些常见的未定义行为,写程序时应该尽量避免。 指针相关的常见未定义行为有如下内容: 解引用 nullptr 指针; 解引用一个未初始化的指针; ...
  • a[n]里面能装n个数,可这是从0开始装的,当我们从1开始装的时候,最大的数组下标是n-1,可上面那段代码我们却让它给数组下标为n的数组赋值,因此发生了数组越界,也就是未定义问题。 改成如下代码即可: #include ...
  • C/C++中未定义行为

    2017-08-29 10:20:25
    C/C++中未定义行为
  • c语言中的未定义行为

    千次阅读 2016-04-14 08:56:28
    下列 C 代码中,不属于未定义行为的有_A.Int i=0;i=(i++); B.char *p=”hello”;p[1]=’E’; C.char *p=”hello”;char ch=*p++; D.int i=0;printf(“%d%d\n”,i++,i–); E.都是未定义行为 F.都不是未定义行为...
  • 试谈C语言的未定义行为.pdf
  • C语言的未定义行为

    2017-07-07 12:33:59
    下列 C 代码中,不属于未定义行为的有___ 正确答案: C int i=0;i=(i++); char *p=”hello”;p[1]=’E’; char *p=”hello”;char ch=*p++; int i=0;printf(“%d%d\n”,i++,i--); 都...
  • 未定义行为 若违反某些规则,则令整个程序失去意义。 定义 在计算机程序设计中,未定义行为(undefined behavior)是指执行某种计算机代码所产生的结果,这种代码在当前程序状态下的行为在其所使用的语言标准中没有...
  • 在计算机程序设计中,未定义行为(undefined behavior)是指行为不可预测的计算机代码。(尤其是在c语言中中) 因为简化标准,所以标准规定某些操作是未定义的,意味着:程序员不能够预测会发生什么事情。 即为:...
  • C语言中的未定义行为(Undefined Behavior) C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,623
精华内容 18,649
关键字:

行为未定义