এসকিউএল সার্ভারে একটি অদ্ভুত অপারেশন সমস্যা: -100 / -100 * 10 = 0


106
  • এক্সিকিউট SELECT -100/-100*10করলে ফলাফল হয় 0
  • এক্সিকিউট SELECT (-100/-100)*10করলে ফলাফল হয় 10
  • এক্সিকিউট SELECT -100/(-100*10)করলে ফলাফল হয় 0
  • এক্সিকিউট SELECT 100/100*10করলে ফলাফল হয় 10

বিওএল বলেছেন:

যখন কোনও অভিব্যক্তিতে দু'জন অপারেটরের একই অপারেটর অগ্রাধিকার স্তর থাকে, তখন তাদের অভিব্যক্তির অবস্থানের ভিত্তিতে বাম থেকে ডানে মূল্যায়ন করা হয়।

এবং

Level   Operators
  1     ~ (Bitwise NOT)
  2     * (Multiplication), / (Division), % (Modulus)
  3     + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)

বিওএল ভুল, বা আমি কিছু মিস করছি? দেখে মনে -হচ্ছে এটি (প্রত্যাশিত) অগ্রাধিকার ছুঁড়ে দিচ্ছে।


7
তোমার প্রশ্নটি কি?
Ilyes

14
আপনি কেন মনে করেন যে আপনাকে বিটগুলি করতে হবে, আপনি পূর্ণসংখ্যার সাথে কাজ করছেন। এবং পূর্ণসংখ্যা / পূর্ণসংখ্যা = পূর্ণসংখ্যা। সুতরাং -100 / -1000 0
sepupic

5
ঠিক আছে, আমি সম্মত হই না, -এটি প্রবাহকে "ভুল" করার কারণ হিসাবে মনে হচ্ছে। চেষ্টা -100/(-100)*10করলে ফলাফল পাবেন 10। দেখে মনে /হচ্ছে -সমীকরণের মানটির বিরুদ্ধে প্রয়োগ করা হচ্ছে এবং তারপরে সমীকরণটি 100*10নির্ধারণ করা হচ্ছে। আমি নিশ্চিত নই যে এটি বিওএল-তে একটি ত্রুটি, তবে আরও বেশি যে এসকিউএল সার্ভার প্রত্যাশা অনুযায়ী আচরণ করছে না। এটি স্কেল-ডক্সে একটি সমস্যা উত্থাপন এবং তাদের প্রতিক্রিয়া কী তা দেখার জন্য মূল্যবান হতে পারে ; "বৈশিষ্ট্য" এর পরামর্শে ডকুমেন্টেশনে একটি নোট যুক্ত করা যেতে পারে।
লার্নু

3
SELECT -100/(-100)*1010. এছাড়াও ফিরে আসে 10 দেখে মনে -হচ্ছে যে -অপারেটর হিসাবে 100*10গণনা করা হয়েছে কেবল তার পরে প্রয়োগ করা উচিত
Panagiotis Kanavos

7
A / -B * Cহয় A <div> <negate> B <multiply> C। নেগেটের ডক্স অনুসারে গুণনের চেয়ে কম অগ্রাধিকার রয়েছে, সুতরাং ফলাফল A / -(B * C)। আপনি ভাসমান ধ্রুবকগুলি ব্যবহার করে এটি আরও স্পষ্ট দেখতে পাচ্ছেন: 12e / -13e * 14eবনাম 12e / (-13e) * 14eবনাম 12e / 13e * 14e। কারণ এটি আমাদের ফেলে দেয় কারণ আমরা সাধারণত অনার বিয়োগটি আক্ষরিক অংশ হওয়ার প্রত্যাশা করি বা কমপক্ষে খুব উচ্চতর প্রাধান্য পাই তবে এটি টি-এসকিউএল নয় not কাজ করে।
জেরোইন মোস্টার্ট

উত্তর:


96

প্রাধান্য টেবিল অনুযায়ী, এই হল প্রত্যাশিত আচরণ। উচ্চতর প্রাধান্য (সঙ্গে অপারেটর /এবং *) কম প্রাধান্য (ইউনারী সঙ্গে অপারেটর সামনে মূল্যায়ন করা হয় -)। আমার স্নাতকের:

-100 / -100 * 10

হিসাবে মূল্যায়ন করা হয়:

-(100 / -(100 * 10))

নোট করুন যে এই আচরণটি বেশিরভাগ প্রোগ্রামিং ভাষাগুলির থেকে পৃথক যেখানে অ্যানারি অস্বীকৃতির গুন এবং বিভাগ যেমন ভিবি , জাভাস্ক্রিপ্টের চেয়ে বেশি অগ্রাধিকার রয়েছে ।


38
বাহ, টি-এসকিউএল এর আরও একটি রত্ন বৈশিষ্ট্য :) আমি অনুমান করি বাগগুলি অনুসন্ধান করার জন্য আমাকে এখনই আমার সমস্ত কোডের নিরীক্ষণ করতে হবে।
usr

14
ওহ মানুষ. এটি বিভিন্ন পিএইচপি টেরিনারি অপারেটর বাগগুলি bugs.php.net/bug.php?id=61915 এর চেয়েও খারাপ । কোন বুদ্ধিমান লোকেরা মনে করে যে বাইনারি অপারেটরগুলির তুলনায় অ্যানারি অপারেটরদের কম অগ্রাধিকার থাকতে হবে?
ফুক্লভ

12
আসল পার্থক্যটি -অপারেটর হিসাবে বিবেচিত কিনা -100। কিছু ভাষায়, এটি একটি পূর্ণসংখ্যার সিনট্যাক্সের অংশ।
বারমার

7
সুতরাং এটি unary তাদের নজির একটি বাগ -
কেভিন

4
এবং পাল্টা স্বজ্ঞাত ডিজাইনের বিজয়ী হ'ল ...: মাইক্রোসফ্ট - আরও একবার
রেক্সকোগিটান

34

বিওএল সঠিক। -এর চেয়ে কম অগ্রাধিকার রয়েছে *, তাই

-A * B

হিসাবে পার্স করা হয়

-(A * B)

গুণটি যা তা হ'ল, আপনি সাধারণত এটি লক্ষ্য করবেন না, অন্য দুটি বাইনারি অপারেটরকে সমান নজিরযুক্ত মিশ্রণ ব্যতীত: /এবং %(এবং %এরকম যৌগিক প্রকাশে খুব কমই ব্যবহৃত হয়)। সুতরাং

C / -A * B

হিসাবে পার্স করা হয়

C / -(A * B)

ফলাফল ব্যাখ্যা। এই পাল্টা-স্বজ্ঞাত কারণ অধিকাংশ অন্যান্য ভাষায়, ইউনারী বিয়োগ বেশী প্রাধান্য রয়েছে *এবং /কিন্তু টি-SQL এর যে না, এবং এই সঠিকভাবে নথিভুক্ত করা হয়।

এটি চিত্রিত করার জন্য একটি দুর্দান্ত (?) উপায়:

SELECT -1073741824 * 2

একটি গাণিতিক ওভারফ্লো -(1073741824 * 2)উত্পাদন করে , কারণ 2147483648একটি মধ্যবর্তী হিসাবে উত্পাদন করে , যা একটি ফিট করে না INT, তবে

SELECT (-1073741824) * 2

প্রত্যাশিত ফলাফল উত্পাদন করে -2147483648, যা করে।


"বিয়োগ" বাইনারি হয়। ইউনারি -হ'ল "নেতিবাচক"। "নেতিবাচক 10" যখন বোঝায় "বিয়োগ 10" এর মতো জিনিসগুলি লোকেদের অশুদ্ধ করা হচ্ছে।
সংগৃহীত

11
@ অ্যাকসিউমুলেশন: অবোধ আমার নয়। -অপারেটর, যখন একটি একক প্রতীক প্রয়োগ, বলা হয় MINUSSQL কোয়েরি পরিকল্পনায়। তার বাইনারি সহযোগীর বলা হয় SUB। আপনি যদি পছন্দ করেন তবে "ইউনারী বিয়োগ" শর্টহ্যান্ড হিসাবে "বিয়োগ চিহ্ন দ্বারা স্বাক্ষরিত ইউরি অপারেটর" - অর্থাতত্ত্বের পদবি পরিবর্তনের পরিবর্তে সিনট্যাকটিক হিসাবে ব্যাখ্যা করুন।
জেরোইন মোস্টার্ট

3
"নেগেটিভ 10" হ'ল মানক আমেরিকান ব্যবহার (আমি বিশ্বাস করি) তবে এটি ইউকেতে মানক নয়।
আলকিমিস্ট

12

ডকুমেন্টেশনে লক্ষ্য করুন যে (সম্ভবত পাল্টা স্বজ্ঞাগতভাবে) এর জন্য অগ্রাধিকারের ক্রমটি - (Negative)তৃতীয়।

সুতরাং আপনি কার্যকরভাবে পেতে:

-(100/-(100*10)) = 0

যদি আপনি এগুলিকে ভেরিয়েবলে রাখেন তবে আপনি এটি ঘটবে না, কারণ কোনও গুণহীনতার পরে কোনও অ্যানারি অপারেশন নেই।

সুতরাং এখানে A এবং B সমান, যেখানে C, D, E আপনি যে ফলাফলটি দেখছেন তা দেখায় (E এর সাথে সম্পূর্ণ বন্ধনী রয়েছে)

DECLARE @i1 int, @i2 int, @i3 int;

SELECT @i1 = -100,
       @i2 = -100,
       @i3 = 10;

SELECT @i1/@i2*@i3      [A],
       -100/(-100)*10   [B],
       -100/-100*10     [C],
       -100/-(100*10)   [D],
       -(100/-(100*10)) [E];

A - 10
B - 10
C - 0
D - 0
E - 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.